Tkinter-根窗口在关闭其顶级窗口后会自动隐藏

时间:2020-10-12 01:15:25

标签: python tkinter

在我的代码下面:

from tkinter import *
from tkinter import ttk

class MainWindow:
    def __init__(self):
        self.parent=Tk()
        self.parent.geometry("494x410+370+100")
        self.parent.title("My Software - TEST")
        self.parent.iconbitmap("icon.ico")

        Button = ttk.Button(self.parent, text="open a new widnow", command=self.OpenNewWindow)
        Button.place(x=16, y=16)

    def OpenNewWindow(self):
        self.obj = NewWindow(self)

class NewWindow:
    def __init__(self, mw):
        self.window, self.mw = Toplevel(mw.parent), mw
        self.window.geometry("200x150+360+200")
        self.window.title("New Window")
        self.window.iconbitmap("icon.ico")
        
        # the "try/except" code has an issue..  
        try:
            self.window.focus()
            self.mw.parent.attributes('-disabled', 1)
            self.window.transient(mw.parent)
            self.window.grab_set()
            self.mw.parent.wait_window(self.window)
        finally:
            self.mw.parent.attributes('-disabled', 0)

def main():
    app=MainWindow()

if __name__=="__main__":
    main()

try / except代码使“顶级”窗口很重要。当它运行时,用户无法触摸根窗口,如果尝试这样做,则铃声会响起,并且Toplevel窗口会闪烁。这正是我想要的行为!但是这段代码有一个问题..当用户关闭“顶层”窗口时,根目录没有变为活动窗口。这是一个大问题,因为它会使根窗口返回其他窗口。查看我的gif以更好地理解我的意思:

http://www.imagebam.com/image/c983ce1356199964

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您对尝试...的想法有误。它不能那样工作。有两种方法可以做您想要的。一种方法是将代码简单地放在主窗口中:

from tkinter import *
from tkinter import ttk

class MainWindow:
    def __init__(self):
        self.parent=Tk()
        self.parent.geometry("494x410+370+100")
        self.parent.title("My Software - TEST")
        self.parent.iconbitmap("icon.ico")

        Button = ttk.Button(self.parent, text="open a new widnow", command=self.OpenNewWindow)
        Button.place(x=16, y=16)

    def OpenNewWindow(self):
        self.parent.attributes('-disabled', 1)
        self.obj = NewWindow(self)
        self.parent.attributes('-disabled', 0)
        

class NewWindow:
    def __init__(self, mw):
        self.window, self.mw = Toplevel(mw.parent), mw
        self.window.geometry("200x150+360+200")
        self.window.title("New Window")
        self.window.iconbitmap("icon.ico")

        self.window.focus()
        self.window.transient(mw.parent)
        self.window.grab_set()
        self.mw.parent.wait_window(self.window)

def main():
    app=MainWindow()
    app.parent.mainloop()

if __name__=="__main__":
    main()

另一种方法是使方法在顶层关闭时运行:

from tkinter import *
from tkinter import ttk

class MainWindow:
    def __init__(self):
        self.parent=Tk()
        self.parent.geometry("494x410+370+100")
        self.parent.title("My Software - TEST")
        self.parent.iconbitmap("icon.ico")

        Button = ttk.Button(self.parent, text="open a new widnow", command=self.OpenNewWindow)
        Button.place(x=16, y=16)

    def OpenNewWindow(self):
        self.obj = NewWindow(self)

class NewWindow:
    def __init__(self, mw):
        self.window, self.mw = Toplevel(mw.parent), mw
        self.window.geometry("200x150+360+200")
        self.window.title("New Window")
        self.window.iconbitmap("icon.ico")
        self.window.protocol("WM_DELETE_WINDOW", self.on_close)

        self.window.focus()
        self.mw.parent.attributes('-disabled', 1)
        self.window.transient(mw.parent)
        self.window.grab_set()
        self.mw.parent.wait_window(self.window)

    def on_close(self):
        self.mw.parent.attributes('-disabled', 0)
        self.window.destroy()

def main():
    app=MainWindow()
    app.parent.mainloop()

if __name__=="__main__":
    main()