TurboC
TurboC

Reputation: 908

Tkinter - The Root Window hides itself after close its Toplevel window

below my code:

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()

the try/except code makes the Toplevel window important. when it runs, the user can't touch the root window, and if he try to do it, a bell songs and the Toplevel window flashes. it's the exactly behaivour that I want! but this piece of code has an issue.. when the user close the Toplevel window, the root doesn't became the active window. it's a big issue because it makes the root window to go back the other ones. see my gif to understand better what I mean:

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

how can I solve this issue?

Upvotes: 2

Views: 125

Answers (1)

Novel
Novel

Reputation: 13729

You've got the wrong idea about try ... finally; it does not work that way. There are 2 ways to do what you want. One way is to simply put that code in the main window:

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()

Another way is to make a method to run when the toplevel closes:

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()

Upvotes: 1

Related Questions