2015-12-15 12 views
5

Im wechseln versuchen, mich selbst zu lehren, wie tkinter zu verwenden, und ich fand youtube einen nützlichen Code durch, die ich voll und ganz verstehen nicht wirklich. Würde es schätzen, wenn einige mir helfen könnten, es zu verstehen. So bezeichnet die Dinge, die ich nicht verstand, mit **Tkinter! Zu verstehen, wie Frames

import tkinter as tk # why not from tkinter import? ** 

class SampleApp(tk.Tk): tk.TK** 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     # 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(container, 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=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() 
+0

könnten Sie bitte den YouTube-Link teilen? –

+0

@BryanOakley Falls Sie noch suchen, ich habe gesehen, [diese] (https://www.youtube.com/watch?v=jBUpjijYtCk) Tutorial, das Sie den Code aus dem [ursprünglichen Frage] verwendet (http: // stackoverflow.com/a/7557028/3826759), obwohl er sagt, woher es kommt. Es gibt auch [diese] (https://pythonprogramming.net/plotting-live-bitcoin-price-data-tkinter-matplotlib/). –

+0

@double_j: Ja, ich fand es schon eine Weile her, aber dank. Ich habe diesen anderen Link, den du angegeben hast, nicht gesehen. Ich habe die ursprüngliche Antwort verbessert, damit ich sagen kann, wer mit meinem Code begonnen hat und wer mit diesem Video-Tutorial angefangen hat. Dieser Code hat ein Eigenleben angenommen, das in vielen neuen Fragen auftaucht. –

Antwort

13
import tkinter as tk # why not from tkinter import? ** 

Warum nicht from tkinter import *? Weil das der falsche Weg ist. Global imports are bad. Tkinter Tutorials neigen dazu, es aus irgendeinem Grund falsch zu machen, den ich nicht verstehe.

Der Grund für die as tk Teil ist, so dass Sie tk.Frame statt Tkinter.Frame tun können, so dass der Code ein wenig einfacher zu schreiben und ein wenig einfacher zu lesen. Es ist völlig optional.

class SampleApp(tk.Tk): 

tk ist der Name des importierten tkinter-Moduls. Tk ist der Name einer Klasse in diesem Modul, das das Wurzelfenster darstellt. Jede tkinter-Anwendung muss ein einzelnes Root-Fenster haben. Durch sie innerhalb von SampleApp platzieren, schafft dies eine Unterklasse dieser widget - eine Kopie, die zusätzliche Funktionen.

Es ist nicht notwendig, von tk.Tk zu erben. Sie können von tk.Frame, jeder anderen tkinter Widget oder sogar object erben. Es ist eine persönliche Vorliebe. Die Auswahl macht manche Dinge leichter, manche schwerer.

container = tk.Frame(self) 

Die oben erstellt eine Instanz eines Frame widget, die als Behälter für andere „Seiten“ verwendet wird. Diese "Seiten" werden in diesem Container alle übereinander gestapelt.

frame = F(container, self) 

F ist die Schleifenvariable. Die Schleife wird Iterieren über eine Liste von Klassen, so dass jedes Mal durch die Schleife F wird eine Klasse repräsentieren. F(...) erstellt eine Instanz der Klasse. Diese Klassen (StartPage, PageOne, PageTwo) erfordern alle zwei Parameter: ein Widget, das die Mutter dieser Klasse sein, und ein Objekt, das will Server als Controller (ein Begriff aus der UI Rüttler geborgt Modell/view/controller).

Die Codezeile erstellt eine Instanz der Klasse (die selbst eine Unterklasse eines Frame-Widgets ist) und weist den Frame der lokalen Variablen frame temporär zu.

Durch die Übergabe von self als zweiten Parameter ("controller") können diese neuen Klasseninstanzen Methoden im Klassenobjekt SampleApp aufrufen.

self.frames[page_name] = frame 

Dies speichert einen Verweis auf den gerade erstellten Rahmen in einem Wörterbuch. Der Schlüssel zum Wörterbuch ist der Name der Seite (oder genauer gesagt, der Name der Klasse).

Dies ist, wie die show_frame Methode nur aus dem Namen der Klasse der eigentlichen Seite Widget bestimmen kann.

frame.tkraise() 

In fast allen GUI-Toolkits - tkinter enthalten - da der Begriff einer „Stapelreihenfolge“ ist: die Reihenfolge, in der die Dinge gestapelt sind. Einige Toolkits nennen dies möglicherweise die z-Reihenfolge. Wenn zwei oder mehr widgets übereinander gestapelt ist (die in diesem Code macht, indem alle Seiten in der gleichen Zeile und Spalte setzen), der Widget, das auf der Oberseite des Stapels ist, ist das Widget, das typischerweise sichtbar.

tkraise ist ein Verfahren eines Frame Objekt, das den Rahmen an der Spitze des Stapelreihenfolge erhöhen wird. In dieser Codezeile bezieht sich frame auf eine bestimmte Instanz einer der Seiten.

tk.Frame.__init__(self, parent) 

Da jede Seite eine Unterklasse einer tk.Frame Klasse ist, ruft dies den Konstruktor der übergeordneten Klasse. Dies ist notwendig, um alle internen Strukturen zu initialisieren, aus denen das eigentliche Frame-Widget besteht. Obwohl ein Frame viele Optionen nehmen, dieser Code wählt in nur einer schicken - ein Verweis auf ein anderes Widget, das als Mutter dieses neuen Widget zu handeln.

self.controller = controller 

Der obige Code wird einfach der Wert des controller Variable „Erinnerung“, die in. In diesem Fall übergeben wurden, ist die controller die Anwendung. Wenn diese Klasse gespeichert wird, kann sie Methoden auf dem Objekt SampleApp aufrufen.


Hinweis: der Code in der Frage kam von einem Tutorial, das Code aus dieser Antwort kopiert: https://stackoverflow.com/a/7557028/7432. Ich bin der Autor dieses ursprünglichen Codes, aber nicht der Autor des Tutorials. In dieser ursprünglichen Antwort finden Sie Links zu anderen Fragen zu diesem Code.

+0

vielen dank! Du weißt nicht, wie sehr mir das geholfen hat! – Baller

Verwandte Themen