当特定窗口关闭时,如何关闭所有 Tkinter 窗口?

Posted

技术标签:

【中文标题】当特定窗口关闭时,如何关闭所有 Tkinter 窗口?【英文标题】:How do you close all Tkinter windows when specific window closes? 【发布时间】:2021-04-08 02:13:48 【问题描述】:

我在 Python Tkinter 中有这个应用程序。有一个 Python 文件,它是一个主菜单。当我单击主菜单中的一个选项时,它会导入一个带有创建新窗口的代码的 python 文件(由于某些原因,新窗口不能使用Toplevel)。所以当我关闭主菜单时,它应该关闭所有其他窗口。

这是我的主菜单代码:

from tkinter import *


root = Tk()
root.geometry("600x600")


def newWindowImport():
    import file1

def newWindowImport2():
    import file2


newWindow = Button(text="new window", command=newWindowImport).pack()
newWindow2 = Button(text="new window", command=newWindowImport2).pack()


# Here is there a way so that when I exit it destroys the Main Menu as well as the opened windows
exitBtn = Button(text="Exit", command=root.destroy())


root.mainloop()

我尝试了root.destroy 方法,但它只破坏了主菜单,而不是所有的窗口。有没有办法让我退出主菜单时它会破坏主菜单以及打开的窗口?如果我要使用Toplevel - 我将如何在单独的文件中使用它?

【问题讨论】:

请编辑您的问题,并附上这些导入文件中的内容示例——让人们了解为什么使用Toplevel 对您不起作用。 【参考方案1】:

我假设您的其他脚本有 Tk() 的单独实例,它们自己的 mainloop() 并且不在函数下,如果是这种情况,您可以将文件中的所有代码放在函数下并使用Toplevel(),例如,file1 应该是这样的

def something():
    window=Toplevel()
    #Rest of the code

同样file2,之后在你的主程序中你可以做这样的事情

from tkinter import *
import file1, file2

root = Tk()
root.geometry("600x600")

def newWindowImport():
    file1.something()

def newWindowImport2():
    file2.something()

newWindow = Button(text="new window", command=newWindowImport)
newWindow.pack()
newWindow2 = Button(text="new window", command=newWindowImport2)
newWindow2.pack()

# Here is there a way so that when I exit it destroys the Main Menu as well as the opened windows
exitBtn = Button(text="Exit", command=root.destroy)

root.mainloop()

您也可以放弃这些功能并进行这些更改以使其更短

newWindow = Button(text="new window", command=file1.something)
newWindow.pack()
newWindow2 = Button(text="new window", command=file2.something)
newWindow2.pack()

您的方法不起作用的原因是每个文件都有自己的mainloop(),因此当您在主代码中调用root.destroy 时它们无法被销毁。

另外请注意,我已经从command=root.destroy 中删除了括号(),否则它将在程序初始化后立即被调用。

编辑: 正如@martineau 在 cmets 中所建议的那样,最好在 Button 实例上单独使用 .pack(),因为它为稍后在程序中使用实例提供了更大的灵活性,而不是让他们持有价值None,这是来自.pack()的回报

【讨论】:

pack() 总是返回 None,所以这是分配给 newWindownewWindow 2 的值。 @martineau 我同意这一点,但如果 OP 以后不想对Button 的配置进行任何更改,我认为这应该不是问题,请更正如果我错了,我会很高兴学习 虽然在示例代码中你可能已经侥幸逃脱了,甚至可能知道,但这肯定不是很明显。由于这是一个常见的新手错误,我认为最好不要通过重复(两次!)来强化潜在问题。 @martineau 谢谢你的建议,我已经更新了我的答案【参考方案2】:

使用Toplevel 是执行此操作的正确方法,您需要找出原因并纠正它。如果你这样做了,这个问题就会自行解决。另外,您需要从命令中删除(),它应该是这样的:

exitBtn = Button(text="Exit", command=root.destroy)

【讨论】:

虽然我同意使用 Toplevel 是理想的方法,但 OP 明确表示他们尝试使用它但没有用。

以上是关于当特定窗口关闭时,如何关闭所有 Tkinter 窗口?的主要内容,如果未能解决你的问题,请参考以下文章

使用 tkinter 的不可关闭的窗口

tkinter 和 matplotlib:在 Linux 下程序关闭之前不会显示窗口

如何让tkinter自动关闭窗口后显示另一个窗口?

如何关闭 tkinter 窗口?

Python TKinter 事件 - 关闭窗口 [重复]

如何使用 python 3 tkinter/guizero 在主窗口中间启动第二个窗口?