【问题标题】:passing arguments in tkinter's protocol("WM_DELETE_WINDOW") function on python在 python 上的 tkinter 协议(“WM_DELETE_WINDOW”)函数中传递参数
【发布时间】:2018-03-11 13:23:37
【问题描述】:

我正在尝试创建一个简单的 python 程序,其中一个线程处理 UI 和另一个“后台内容”。当用户尝试退出我的应用程序时,我想运行一个函数,出现一个对话选项。

当我运行以下代码时,函数“on_closing()”会自动运行。据我了解,我只能在协议函数中传递函数名,但我需要几个参数。

class MainWindow:

    def __init__(self, master):

        master.resizable(0, 0)
        master.protocol("WM_DELETE_WINDOW", self.on_closing(master))
        do_stuff('...')

    def on_closing(self, master):
        do_stuff('...')
        self.Destroy(master)

def call_window_manager(title):
    do_stuff(title)
    root = Tk()
    mw = MainWindow(root)
    root.mainloop()


def call_tools(title, mainwindow, master):
    do_stuff(title)


if __name__ == '__main__':

    do_stuff('main line')

    p1 = mp.Process(target=call_window_manager, args=('Window Manager Thread',))
    p2 = mp.Process(target=call_tools, args=('Tools Thread',))

    p1.start()
    p2.start()
    p1.join()
    p2.join()

那我该如何传递参数呢?我是以错误的方式处理这个问题吗?

Ps:同时终止另一个线程的最佳方法是什么?

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    您可以使用lambda 将参数传递给protocol 的回调函数。如替换:

    master.protocol("WM_DELETE_WINDOW", self.on_closing(master))
    

    与:

    master.protocol("WM_DELETE_WINDOW", lambda arg=master: self.onclosing(arg))
    

    【讨论】:

    • 感谢您的回答!这正是我所需要的。
    • master 本身不是会随时间变化的变量,因此没有理由这样做arg=master。只需master.protocol("WM_DELETE_WINDOW", lambda: self.on_closing(master)) 就可以在这里正常工作。在这一点上,最好只做master.protocol("WM_DELETE_WINDOW", self.on_closing) 并让on_closing 方法做self.master.destroy()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2018-01-25
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多