Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使pythontkinter根只关闭自己?_Python_Tkinter - Fatal编程技术网

如何使pythontkinter根只关闭自己?

如何使pythontkinter根只关闭自己?,python,tkinter,Python,Tkinter,我的程序中有许多根(帧)。如何设置操作系统退出按钮的命令(面板顶部的x)?我想让它只关闭一个窗格,而不是整个程序。我找到了在框架上创建自己的退出按钮的代码,但我不想重置我已经拥有的所有按钮的位置 编辑:我忘了提到我正在使用Ubuntu 编辑2: root3 = Tk() root = Tk() root2 = Tk() 这就是我初始化三帧对象的方式(我没有足够的声誉来发布图像)。我看了Toplevel,我认为Bryan Oakley的意思是我应该这样做: frame1 = Toplevel()

我的程序中有许多根(帧)。如何设置操作系统退出按钮的命令(面板顶部的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
回溯(最近一次呼叫最后一次):
文件“GUI\u Robot\u Control.py”,第823行,在
协议(“WM_DELETE_WINDOW”,root.destroy())
wm_协议中的文件“/usr/lib/python2.7/lib-tk/Tkinter.py”,第1630行
“wm”、“协议”、自身(名称、命令)
_tkinter.TclError:无法调用“wm”命令:应用程序已被销毁

提前谢谢

不清楚您指的是多个
Tk
实例还是多个
Toplevel
窗口,但如果您需要控制当用户单击其中一个窗口上的关闭按钮时会发生什么,您可以使用register a protocol handler:

widget.protocol("WM_DELETE_WINDOW", handler)
调用后,close按钮将调用函数
处理程序
,而不是关闭窗口。默认行为类似于:

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

(是的,这有点晦涩难懂,但任何一本Tkinter书都应该对此进行解释)

我可以告诉你这个问题的答案吗


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

Tk()
创建一个根窗口。您的应用程序必须始终具有其中一个。所有tkinter应用程序都必须有一个根窗口,这正是它的工作原理。当此窗口被破坏时,您的应用程序将退出(通常情况下,尽管从技术上讲,这可能不是真的)

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

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


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

根和帧在Tkinter中是两件截然不同的事情。因此,没有任何代码就很难帮助您。您可以发布您的脚本吗?如果您有多个根窗口(
Tk
),那么您的操作非常错误。这就是你正在做的吗?或者当你说“根数”时,你是在说
Toplevel
的实例吗?我试过了,但在上面的编辑中出错了。谢谢你!如果您还有其他建议,我将不胜感激!谢谢正如你所建议的,我可以通过一个根窗口和两个“Toplevel”实例来解决这个问题!