Sök…


Skillnaden mellan Tk och Toplevel

Tk är den absoluta roten till applikationen, det är den första widgeten som måste instanseras och GUI stängs av när den förstörs.

Toplevel är ett fönster i applikationen, att stänga fönstret förstör alla barnwidgets som är placerade i det fönstret {1} men stänger inte programmet.

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

Om ditt python-program bara representerar en enda applikation (som det nästan alltid kommer att göra) bör du bara ha en Tk instans, men du kan skapa så många Toplevel fönster som du vill.

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}: Om en Toplevel ( A = Toplevel(root) ) är överordnad till en annan Toplevel ( B = Toplevel(A) ) stängs fönster A också fönster B.

ordna fönsterstapeln (lyftmetoden)

Det mest grundläggande fallet för att lyfta ett visst fönster ovanför de andra, ring .lift() metoden .lift() det fönstret (antingen Toplevel eller 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()

Men om det fönstret förstörs genom att försöka lyfta kommer det att ge ett sådant fel:

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"

Ofta när vi försöker sätta ett visst fönster framför användaren men det stängdes är ett bra alternativ att återskapa det fönstret:

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

På det här sättet visar funktionen show_dialog dialogfönstret om det finns eller inte. Observera också att du kan ringa .winfo_exists() att kontrollera om det finns innan du försöker lyfta fönstret istället för att lasta in det i ett try:except .

Det finns också .lower() som fungerar på samma sätt som .lift() förutom att sänka fönstret i bunten:

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

Du kommer att märka att det sänks även under andra applikationer, för att bara sänka under ett visst fönster kan du skicka det till .lower() , på liknande sätt kan detta också göras med .lift() för att bara höja ett fönster ovanför ett annat ett.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow