【问题标题】:Access variable inside an non-return function from other package without global variable从没有全局变量的其他包访问非返回函数内的变量
【发布时间】:2017-02-11 15:54:03
【问题描述】:

是否有访问函数结果的方法,我已在其上应用了另一个函数。例如:

win32gui.EnumWindows(a_function, extra)

EnumWindows 将迭代所有顶级窗口并将 hwnd 传递给 a_function。

如果我设置一些条件来 grep 我想要的 hwnd,我们需要产生 hwnd id

是否有一种方法可以从 a_function 访问某些返回/收益。而不是函数 EnumWindows 将 grep 返回。

【问题讨论】:

    标签: python


    【解决方案1】:

    EnumWindows 不返回任何内容。 通常从中检索结果的方式通常是让回调函数将数据存储在全局中。在this question 中有一个这样做的例子。

    另一种方法是将可变容器对象(例如list)作为extra 参数传递,然后在每次调用时将其作为第二个参数传递给回调(第一个参数是一个窗口句柄)。

    这是使用第二种技术的示例,它将本地列表对象传递给回调函数修改的EnumWindows(),但前提是窗口可见。

    import win32gui
    
    def my_callback(hwnd, list_object):
        if win32gui.IsWindowVisible(hwnd):
            title = win32gui.GetWindowText(hwnd)
            if title:
                list_object.append(title)
    
    def print_windows_titles():
        my_list = []  # local variable
    
        win32gui.EnumWindows(my_callback, my_list)  # populates my_list
    
        # print result of calling EnumWindows
        print('Titles of Visible Windows:')
        for window_title in my_list:
            print('  {!r}'.format(window_title))
    
    print_windows_titles()
    

    【讨论】:

    • 谢谢你的回答,这就是我的想法。全局变量确实很好地解决了这个问题。由于避免全局变量是初学者的经验法则,我正在考虑这个以弄清楚是否有访问方法。回调和全局 hwnd 内部的操作确实是解决这个问题的方法。
    • 你的意思是我可以将list_object传递给extra并从函数what_i_need_return=win32gui.EnumWindows(a_function, list_object).list_object中获取list_object吗?
    • 没有。我的意思是你可以将一个列表对象传递给EnumWindows,并且每次调用 it 时它都会传递给你的回调函数。但你说得对,这是一种避免使用全局变量的方法。
    • 这是一个很有帮助的例子。非常感谢~
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多