Recherche…


Différence entre Tk et Toplevel

Tk est la racine absolue de l'application, c'est le premier widget qui doit être instancié et l'interface graphique s'arrête lorsqu'elle est détruite.

Toplevel est une fenêtre de l'application, la fermeture de la fenêtre détruira tous les widgets enfants placés dans cette fenêtre {1} mais ne fermera pas le programme.

try:
    import tkinter as tk #python3
except ImportError:
    import Tkinter as tk #python2

#root application, can only have one of these.
root = tk.Tk() 

#put a label in the root to identify the window.
label1 = tk.Label(root, text="""this is root
closing this window will shut down app""")
label1.pack()

#you can make as many Toplevels as you like
extra_window = tk.Toplevel(root)
label2 = tk.Label(extra_window, text="""this is extra_window
closing this will not affect root""")
label2.pack()

root.mainloop()

Si votre programme python ne représente qu'une seule application (ce qui sera presque toujours le cas), vous ne devriez avoir qu'une seule instance Tk , mais vous pouvez créer autant de fenêtres Toplevel que vous le souhaitez.

try:
    import tkinter as tk #python3
except ImportError:
    import Tkinter as tk #python2

def generate_new_window():
    window = tk.Toplevel()
    label = tk.Label(window, text="a generic Toplevel window")
    label.pack()

root = tk.Tk()

spawn_window_button = tk.Button(root,
                                text="make a new window!",
                                command=generate_new_window)
spawn_window_button.pack()

root.mainloop()

{1}: si un Toplevel ( A = Toplevel(root) ) est le parent d'un autre Toplevel ( B = Toplevel(A) ) alors la fermeture de la fenêtre A fermera également la fenêtre B.

organiser la pile de fenêtres (la méthode .lift)

Le cas le plus fondamental pour soulever une fenêtre particulière au-dessus des autres, il suffit d'appeler la méthode .lift() sur cette fenêtre ( Toplevel ou Tk )

import tkinter as tk #import Tkinter as tk #change to commented for python2

root = tk.Tk()

for i in range(4):
    #make a window with a label
    window = tk.Toplevel(root)
    label = tk.Label(window,text="window {}".format(i))
    label.pack()
    #add a button to root to lift that window
    button = tk.Button(root, text = "lift window {}".format(i), command=window.lift)
    button.grid(row=i)

root.mainloop()

Cependant, si cette fenêtre est détruite en essayant de la soulever, cela provoquera une erreur comme celle-ci:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/.../tkinter/__init__.py", line 1549, in __call__
    return self.func(*args)
  File "/.../tkinter/__init__.py", line 785, in tkraise
    self.tk.call('raise', self._w, aboveThis)
_tkinter.TclError: bad window path name ".4385637096"

Souvent, lorsque nous essayons de placer une fenêtre particulière devant l’utilisateur mais qu’elle est fermée, une bonne alternative consiste à recréer cette fenêtre:

import tkinter as tk #import Tkinter as tk #change to commented for python2

dialog_window = None

def create_dialog():
    """creates the dialog window
  ** do not call if dialog_window is already open, this will
     create a duplicate without handling the other
if you are unsure if it already exists or not use show_dialog()"""
    global dialog_window
    dialog_window = tk.Toplevel(root)
    label1 = tk.Label(dialog_window,text="this is the dialog window")
    label1.pack()
    #put other widgets
    dialog_window.lift() #ensure it appears above all others, probably will do this anyway

def show_dialog():
    """lifts the dialog_window if it exists or creates a new one otherwise"""
    #this can be refactored to only have one call to create_dialog()
    #but sometimes extra code will be wanted the first time it is created
    if dialog_window is None:
        create_dialog()
        return
    try:
        dialog_window.lift()
    except tk.TclError:
        #window was closed, create a new one.
        create_dialog()
    
    
root = tk.Tk()

dialog_button = tk.Button(root,
                          text="show dialog_window",
                          command=show_dialog)
dialog_button.pack()
root.mainloop()

De cette façon, la fonction show_dialog affichera la fenêtre de dialogue, qu'elle existe ou non, notez également que vous pouvez appeler .winfo_exists() pour vérifier si elle existe avant d'essayer de lever la fenêtre au lieu de l'enrouler pour try:except .

Il y a aussi la méthode .lower() qui fonctionne de la même manière que la méthode .lift() , sauf en abaissant la fenêtre dans la pile:

import tkinter as tk #import Tkinter as tk #change to commented for python2

root = tk.Tk()
root.title("ROOT")
extra = tk.Toplevel()
label = tk.Label(extra, text="extra window")
label.pack()

lower_button = tk.Button(root,
                         text="lower this window",
                         command=root.lower)
lower_button.pack()

root.mainloop()

Vous remarquerez que cela diminue même en dessous des autres applications, pour ne descendre que sous une certaine fenêtre, vous pouvez le passer à la méthode .lower() , de même cela peut aussi être fait avec la méthode .lift() un.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow