Toplevel from a Toplevel behavior on Tkinter Python

Mario Jose :

So I made this simple code to recreate the way I want my actual app to behave (sorry, if I didn't use and really new into this):

import tkinter as tk
from tkinter import ttk

def OpenSecondToplevel():
  Top2=tk.Toplevel(root)
  Top2.geometry("250x200")
  Top2.grab_set()
  Top2.title("TopLevel 2")
  Label = tk.Label(Top2, text="This is Toplevel 2")
  Label.pack()

def OpenFirstToplevel():
  Top1=tk.Toplevel(root)
  Top1.geometry("250x200")
  Top1.grab_set()
  Top1.title("TopLevel 1")
  Button2 = tk.Button(Top1, text="Open Toplevel 2", command=OpenSecondToplevel)
  Button2.pack()

root = tk.Tk()
root.title("Main")
root.geometry("250x200")
Frame1 = tk.Frame(root)
Button1 = tk.Button(Frame1, text="Open Toplevel 1", command=OpenFirstToplevel)

Frame1.pack()
Button1.pack()

root.mainloop()

I recorded a video, explaining my issue, because I been looking a lot about Toplevels behavior and I cant seem to find a way to fix it. I hope the video is understandable sorry about the bad English is not my main language, if you have any question you can ask me, thank you!

https://www.youtube.com/watch?v=Ks2zRU0fOJM

acw1668 :

For your case, the simple way is to save the current window which has grab_set() in OpenSecondToplevel(), wait for second toplevel to close and then resume the grab_set() state of saved window:

def OpenSecondToplevel():
    win = root.grab_current() # save the current window which has grab_set()
                              # win is None is no window has grab_set()
    Top2=tk.Toplevel(root)
    Top2.geometry("250x200")
    Top2.grab_set()
    Top2.title("TopLevel 2")
    Label = tk.Label(Top2, text="This is Toplevel 2")
    Label.pack()
    if win:
        # wait until current toplevel is destroyed
        win.wait_window(Top2)
        # resume grab_set() for saved window
        win.grab_set()

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=170482&siteId=1