在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()

该事件在小部件被销毁时触发,这在您关闭主窗口时发生。奇怪的是,如果将事件绑定到主窗口,它会被触发两次。也许更博学的人可以对此有所了解。

【讨论】:

为什么我需要把它绑定到按钮上?我只需要在窗口关闭时执行命令。我可以将它绑定到已经存在的按钮吗? 您可以将其绑定到任何小部件。就像我说的,如果你将它绑定到主窗口,它会触发该方法两次。 FWIW root_win.bind('&lt;Destroy&gt;', good_bye) 为我工作,该函数只被调用一次。 Python 3.6.5 来自 python.org 在 windows 7 32 位上。 您不需要绑定到任何小部件。只需绑定到根窗口。 我试过了,导致函数被调用了两次。

以上是关于在tkinter中关闭窗口之前执行某个命令[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中的窗口窗体应用程序中关闭窗口时发出警报 [重复]

如何在js中关闭用户浏览器选项卡/窗口[重复]

使用 MVVM 灯光从视图模型中关闭窗口 [重复]

在QT中关闭窗口之前获取应用程序退出信号

如何在命令窗口中关闭闪烁的光标?

如何在没有按钮的情况下关闭tkinter窗口而不完全关闭Python?