Umschalten zwischen zwei Frames in tkinter

Ich habe meine ersten Skripts mit einer netten kleinen GUI auf sie gebaut, wie die Tutorials mir gezeigt haben, aber keiner von ihnen adressiert, was für ein komplexeres Programm zu tun ist.

Wenn du etwas mit einem 'Startmenü' hast, für deinen Eröffnungsbildschirm und bei der Benutzerauswahl gehst du in einen anderen Teil des Programms und ziehst den Bildschirm entsprechend neu, was ist die elegante Art, dies zu tun?

Gibt es einfach .destroy() das "Startmenü" –Rahmen und dann ein neues, das mit den Widgets für einen anderen Teil gefüllt ist? Und umgekehrt diesen Prozess, wenn sie die Taste zurück drücken?

2 Solutions collect form web for “Umschalten zwischen zwei Frames in tkinter”

Eine Möglichkeit ist, die Rahmen aufeinander zu stapeln, dann können Sie einfach übereinander in der Stapelreihenfolge aufheben. Der eine oben ist derjenige, der sichtbar ist. Das funktioniert am besten, wenn alle Frames die gleiche Größe haben, aber mit ein wenig Arbeit können Sie es mit jedem sortierten Frames arbeiten.

Hier ist ein bisschen ein Beispiel, um Ihnen das allgemeine Konzept zu zeigen:

 import tkinter as tk # python 3 from tkinter import font as tkfont # python 3 #import Tkinter as tk # python 2 #import tkFont as tkfont # python 2 class SampleApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic") # the container is where we'll stack a bunch of frames # on top of each other, then the one we want visible # will be raised above the others container = tk.Frame(self) container.pack(side="top", fill="both", expand=True) container.grid_rowconfigure(0, weight=1) container.grid_columnconfigure(0, weight=1) self.frames = {} for F in (StartPage, PageOne, PageTwo): page_name = F.__name__ frame = F(parent=container, controller=self) self.frames[page_name] = frame # put all of the pages in the same location; # the one on the top of the stacking order # will be the one that is visible. frame.grid(row=0, column=0, sticky="nsew") self.show_frame("StartPage") def show_frame(self, page_name): '''Show a frame for the given page name''' frame = self.frames[page_name] frame.tkraise() class StartPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller label = tk.Label(self, text="This is the start page", font=controller.title_font) label.pack(side="top", fill="x", pady=10) button1 = tk.Button(self, text="Go to Page One", command=lambda: controller.show_frame("PageOne")) button2 = tk.Button(self, text="Go to Page Two", command=lambda: controller.show_frame("PageTwo")) button1.pack() button2.pack() class PageOne(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller label = tk.Label(self, text="This is page 1", font=controller.title_font) label.pack(side="top", fill="x", pady=10) button = tk.Button(self, text="Go to the start page", command=lambda: controller.show_frame("StartPage")) button.pack() class PageTwo(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller label = tk.Label(self, text="This is page 2", font=controller.title_font) label.pack(side="top", fill="x", pady=10) button = tk.Button(self, text="Go to the start page", command=lambda: controller.show_frame("StartPage")) button.pack() if __name__ == "__main__": app = SampleApp() app.mainloop() 

Wenn Sie das Konzept der Erstellung von Instanz in einer Klasse verwirren, oder wenn verschiedene Seiten unterschiedliche Argumente während der Konstruktion benötigen, können Sie jede Klasse ausdrücklich aufrufen. Die Schleife dient hauptsächlich dazu, den Punkt zu veranschaulichen, dass jede Klasse identisch ist.

Um beispielsweise die Klassen einzeln zu erstellen, kannst du die Schleife ( for F in (StartPage, ...) mit diesem entfernen:

 self.frames["StartPage"] = StartPage(parent=container, controller=self) self.frames["PageOne"] = PageOne(parent=container, controller=self) self.frames["PageTwo"] = PageTwo(parent=container, controller=self) self.frames["StartPage"].grid(row=0, column=0, sticky="nsew") self.frames["PageOne"].grid(row=0, column=0, sticky="nsew") self.frames["PageTwo"].grid(row=0, column=0, sticky="nsew") 

Im Laufe der Zeit haben die Leute andere Fragen mit diesem Code (oder einem Online-Tutorial, das diesen Code kopiert hat) als Ausgangspunkt gefragt. Vielleicht möchten Sie die Antworten auf diese Fragen lesen:

  • Verständnis von Eltern und Controller in Tkinter __init__
  • Tkinter! Verstehen, wie man Frames umschaltet
  • So erhalten Sie variable Daten aus einer Klasse
  • Zugriff auf Variablen aus verschiedenen Klassen in tkinter python 3
  • Wie würde ich eine Methode machen, die jedes Mal ausgeführt wird, wenn ein Frame in tkinter angezeigt wird
  • Tkinter Frame Resize
  • Py2.7: Tkinter hat Code für Seiten in separaten Dateien

Hier ist eine andere einfache Antwort, aber ohne Klassen zu verwenden.

 from tkinter import * def raise_frame(frame): frame.tkraise() root = Tk() f1 = Frame(root) f2 = Frame(root) f3 = Frame(root) f4 = Frame(root) for frame in (f1, f2, f3, f4): frame.grid(row=0, column=0, sticky='news') Button(f1, text='Go to frame 2', command=lambda:raise_frame(f2)).pack() Label(f1, text='FRAME 1').pack() Label(f2, text='FRAME 2').pack() Button(f2, text='Go to frame 3', command=lambda:raise_frame(f3)).pack() Label(f3, text='FRAME 3').pack(side='left') Button(f3, text='Go to frame 4', command=lambda:raise_frame(f4)).pack(side='left') Label(f4, text='FRAME 4').pack() Button(f4, text='Goto to frame 1', command=lambda:raise_frame(f1)).pack() raise_frame(f1) root.mainloop() 
  • Übergeben von Argument, um Funktion in Python zu binden
  • Tkinter: Set StringVar nach <Key> Event, einschließlich der Taste gedrückt
  • Tkinter klebrig funktioniert nicht für einige frames
  • Tkinter - Gehen zurück und weiter zwischen Frames mit Schaltflächen
  • Bilder mit Tkinter anzeigen
  • Suche nach Element in einer mehrdimensionalen Liste funktioniert nicht. Irgendeine Ahnung
  • Datei-Dialoge von Tkinter in Python 3?
  • Kann die Hauptschleife eines Programms aus der GUI verschoben werden?
  • Wie zentriere ich einen Rahmen in einem Rahmen in Tkinter?
  • Schließen Sie das aktuelle Fenster, wenn Sie ein anderes Fenster öffnen
  • Tkinter askquestion Dialogfeld
  • Python ist die beste Programmiersprache der Welt.