在tkinter中关闭窗口之前执行某个命令[重复]
Posted
技术标签:
【中文标题】在tkinter中关闭窗口之前执行某个命令[重复]【英文标题】:Execute a certain command before closing window in tkinter [duplicate] 【发布时间】:2018-11-25 06:26:54 【问题描述】:我正在将 tkinter 与 python 一起使用。
当按下关闭按钮时,是否可以在关闭窗口之前执行某个命令(例如 print ("hello"))?
我使用的是桌面环境的关闭按钮(以及最大化和最小化),而不是任何特殊的关闭按钮。
请注意,我问的是如何在关闭之前执行某个命令,而不是如何关闭窗口(这已经可以通过窗口按钮完成)。 所以这不是this question的复制品
【问题讨论】:
你说它不是重复的,但它是。尽管措辞不同(“handle”与“run a command”),但答案是一样的,都是使用protocol
方法。
布莱恩是正确的。使用协议将“窗口关闭”事件重定向到自定义函数是最好的选择。
【参考方案1】:
根据您想要在窗口关闭时执行的操作,一种可能的解决方案是将您的 GUI 包装到一个类中,在 with
语句中对其进行初始化,然后在 __exit__()
方法中完成您的工作:
import tkinter
class MainWindow(object):
def __init__(self):
print("initiated ..")
self.root = tkinter.Tk()
def __enter__(self):
print("entered ..")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Main Window is closing, call any function you'd like here!")
with MainWindow() as w:
w.root.mainloop()
print("end of script ..")
【讨论】:
为什么 __enter__(self): 是必需的? @ArchismanPanigrahi 当在(“进入”)with
语句中使用类的实例时,将调用 __enter__
方法。【参考方案2】:
这是我想出的:
import tkinter as tki
def good_bye(*args):
print('Yo, dawg!')
root_win = tki.Tk()
my_button = tki.Button(root_win, text='I do nothing')
my_button.pack(padx=20, pady=20)
my_button.bind('<Destroy>', good_bye)
root_win.mainloop()
该事件在小部件被销毁时触发,这在您关闭主窗口时发生。奇怪的是,如果将事件绑定到主窗口,它会被触发两次。也许更博学的人可以对此有所了解。
【讨论】:
为什么我需要把它绑定到按钮上?我只需要在窗口关闭时执行命令。我可以将它绑定到已经存在的按钮吗? 您可以将其绑定到任何小部件。就像我说的,如果你将它绑定到主窗口,它会触发该方法两次。 FWIWroot_win.bind('<Destroy>', good_bye)
为我工作,该函数只被调用一次。 Python 3.6.5 来自 python.org 在 windows 7 32 位上。
您不需要绑定到任何小部件。只需绑定到根窗口。
我试过了,导致函数被调用了两次。以上是关于在tkinter中关闭窗口之前执行某个命令[重复]的主要内容,如果未能解决你的问题,请参考以下文章