Suche…


Unterschied zwischen Tk und Toplevel

Tk ist das absolute Stammverzeichnis der Anwendung. Es ist das erste Widget, das instanziiert werden muss. Die GUI wird heruntergefahren, wenn sie zerstört wird.

Toplevel ist ein Fenster in der Anwendung. Beim Schließen des Fensters werden alle Toplevel Fenster in diesem Fenster {1} Toplevel , das Programm wird jedoch nicht heruntergefahren.

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

Wenn Ihr Python-Programm nur eine einzige Anwendung darstellt (was fast immer der Fall ist), sollten Sie nur eine Tk Instanz haben, aber Sie können so viele Toplevel Fenster erstellen, wie Sie Toplevel .

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}: Wenn ein Toplevel ( A = Toplevel(root) ) das übergeordnete Element eines anderen Toplevels ( B = Toplevel(A) ) ist, wird beim Schließen von Fenster A auch das Fenster B geschlossen.

Anordnen des Fensterstapels (die .lift-Methode)

Der einfachste Fall, um ein bestimmtes Fenster über die anderen zu heben, rufen .lift() einfach die .lift() -Methode in diesem Fenster auf (entweder Toplevel oder 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()

Wenn dieses Fenster jedoch beim Versuch, zu heben, zerstört wird, wird ein Fehler wie der folgende ausgegeben:

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"

Wenn wir versuchen, ein bestimmtes Fenster vor den Benutzer zu setzen, es aber geschlossen wurde, ist es eine gute Alternative, dieses Fenster neu zu erstellen:

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

Auf diese Weise zeigt die Funktion show_dialog das Dialogfenster an, ob es existiert oder nicht. Beachten Sie auch, dass Sie .winfo_exists() aufrufen können, um zu prüfen, ob es existiert, bevor Sie versuchen, das Fenster zu .winfo_exists() anstatt es in try:except .

Es gibt auch die .lower() -Methode, die auf dieselbe Weise wie die .lift() -Methode .lift() , mit der Ausnahme, dass das Fenster im Stapel .lift() :

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

Sie werden bemerken, dass es auch unter anderen Anwendungen sinkt. .lower() nur ein bestimmtes Fenster zu senken, können Sie es an die .lower() -Methode übergeben. In ähnlicher Weise kann dies auch mit der .lift() -Methode geschehen, um nur ein Fenster über einem anderen zu .lift() ein.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow