拦截Tkinter“退出”命令?

时间:2011-01-10 01:27:19

标签: python client-server tkinter exit

我正在使用Tkinter在Python中编写客户端 - 服务器程序。我需要服务器来跟踪连接的客户端。为此,我希望客户端在单击退出按钮(角落中的标准“X”)后向服务器发送自动消息。我怎么知道用户何时退出该程序?

4 个答案:

答案 0 :(得分:13)

您想使用顶层窗口的wm_protocol方法。具体来说,您对WM_DELETE_WINDOW协议感兴趣。如果使用该方法,它允许您注册在窗口被销毁时调用的回调。

用法:

root.protocol("WM_DELETE_WINDOW", app.on_delete)

答案 1 :(得分:5)

您可以使用python atexit模块。

例如:

import atexit

def doSomethingOnExit():
    pass

atexit.register(doSomethingOnExit)

答案 2 :(得分:2)

FWIW:还可以分配特定于窗口小部件的行为。

如果希望在销毁特定窗口小部件时执行操作,则可以考虑覆盖destroy()方法。请参阅以下示例:

class MyButton(Tkinter.Button):
    def destroy(self):
        print "Yo!"
        Tkinter.Button.destroy(self)

root = Tkinter.Tk()

f = Tkinter.Frame(root)
b1 = MyButton(f, text="Do nothing")
b1.pack()
f.pack()

b2 = Tkinter.Button(root, text="f.destroy", command=f.destroy)          
b2.pack()

root.mainloop()

当按下按钮'b2'时,框架'f'被破坏,孩子'b1'和“哟!”打印出来。

我在this topic上发布了相同的答案。

答案 3 :(得分:1)

就我而言,以下代码不起作用:

root.protocol("WM_DELETE_WINDOW", app.on_delete)  # doesn't work

但是,它使用这种形式:

root.wm_protocol ("WM_DELETE_WINDOW", app.on_delete)  # does work
相关问题