0

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

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

编辑2:

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

提前致谢!

4

3 回答 3

1

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

widget.protocol("WM_DELETE_WINDOW", handler)

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

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

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

于 2013-07-23T23:06:17.700 回答
1

在对原始问题的编辑中,您询问Tk和之间的区别Toplevel

Tk()创建一个根窗口。您的应用程序必须始终具有其中之一。所有 tkinter 应用程序都必须有一个根窗口,这就是它的设计方式。当此窗口被销毁时,您的应用程序将退出(通常情况下,尽管技术上可能并非如此)。

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

如果您正在创建一个具有三个窗口的应用程序,那么您有两个选择。首先,您可以使用根窗口和Toplevel. 第二个选项是创建一个根窗口和三个实例Toplevel,然后隐藏原始根窗口。

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

于 2013-07-29T20:45:26.397 回答
0

我可以引导您回答这个问题,其中可能包含您的答案:

如何处理 Tkinter 中的窗口关闭事件?

于 2013-07-24T01:39:16.930 回答