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

时间:2020-12-31 23:16:55

标签: python python-3.x tkinter logic

我在 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 - 我将如何在单独的文件中使用它?

2 个答案:

答案 0 :(得分: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 在评论中所建议的那样,最好在 .pack() 实例上单独使用 Button,因为它为以后使用实例提供了更大的灵活性在程序中,而不是让它们持有值 None,这是 .pack()

的返回值

答案 1 :(得分:0)

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

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