如何使python tkinter root只关闭自己?

时间:2013-07-23 19:20:21

标签: python tkinter

我的程序中有很多根(帧)。如何设置操作系统退出按钮的命令(面板顶部的x)?我想做到这一点,我只能关闭一个窗格,而不是整个程序。我找到了在框架上自己制作退出按钮的代码,但我不想重置我已经拥有的所有按钮的位置。

编辑:我忘了提到我正在使用Ubuntu

EDIT2:

root3 = Tk()
root = Tk()
root2 = Tk()

这就是我初始化三个帧的对象的方式(我没有足够的声誉来发布图像)。我看了Toplevel,我认为 Bryan Oakley 意味着我应该这样做:

frame1 = Toplevel()
frame2 = Toplevel()
frame3 = Toplevel()

然而,这样做会出现第四个(空)框架,而我需要的三个框架仍然完整,我需要的所有小部件都存在。

你能解释一下使用Tk()和Toplevel()以及如何使用它们之间的区别吗?

我尝试使用 Fredrik的解决方案,但收到了以下错误:

Traceback (most recent call last):
  File "GUI_Robot_Control.py", line 823, in <module>
    root.protocol("WM_DELETE_WINDOW", root.destroy())
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1630, in wm_protocol
    'wm', 'protocol', self._w, name, command)
_tkinter.TclError: can't invoke "wm" command:  application has been destroyed

提前致谢!

3 个答案:

答案 0 :(得分:1)

不清楚您是指多个Tk实例还是多个Toplevel窗口,但如果您需要控制当用户单击其中任何一个上的关闭按钮时发生的情况,您可以使用注册协议处理程序:

widget.protocol("WM_DELETE_WINDOW", handler)

此调用后,关闭按钮将调用函数handler,而不是关闭窗口。默认行为类似于:

widget.protocol("WM_DELETE_WINDOW", widget.destroy)

(是的,这有点模糊,但任何Tkinter书都应该解释这一点)

答案 1 :(得分:1)

在对原始问题的修改中,您询问TkToplevel之间的区别。

Tk()创建一个根窗口。您的应用必须始终只有其中一个。所有tkinter应用程序都必须有一个根窗口,这就是它的设计工作方式。当这个窗口被销毁时,您的应用程序将退出(通常,尽管技术上可能不会这样)。

Toplevel(...)创建新的“顶级”窗口。也就是说,窗口没有直接连接到根窗口。这些浮动在桌面上,可以有一个标题栏,关闭按钮等。它们的外观和行为几乎与根窗口完全相同,只是你可以在不破坏整个应用程序的情况下销毁Toplevel的实例。

如果您要创建一个包含三个窗口的应用,则有两种选择。首先,您可以使用根窗口和Toplevel的两个实例。第二个选项是创建一个根窗口和三个实例Toplevel,然后隐藏原始根窗口。

在每种情况下,您都可以使用protocol方法捕获用户单击标题栏中的按钮销毁窗口的时间。然后,您可以否决窗口的破坏,或者执行其他操作,例如关闭数据库连接,打开对话框以要求用户保存未保存的数据等。

答案 2 :(得分:0)

我可以指导你这个可能有你答案的问题:

How do I handle the window close event in Tkinter?