Diesen Teil verstehe ich glaube ich. Die Konsequenz ist dann wahrscheinlich, dass die main.py überflüssig ist und ich die Logik, die darin steckt, auf die view.py und quiz.py Dateien aufteilen muss, sodass der view "losläuft" und sich die Werte aus der quiz.py holt, wenn sie benötigt werden.
Zuerst konnte ich hiermit gar nichts anfangen. Mittlerweile dämmert es. Das ist der Ort an dem das Objekt gespeichert wird. Wenn du sagst, das entspricht nicht dem GUI-Paradigma, heißt das ich kann mit einem Label(*, text=variable) überhaupt nicht auf den String zugreifen oder greife ich einfach "falsch" darauf zu?
Hier zu habe ich bereits ein Vorlage gefunden.__deets__ hat geschrieben: ↑Sonntag 23. Januar 2022, 15:57 Wenn du deinen Ablauf so wie beschrieben machen willst, dann bietet sich dafuer eine Reihe von tk.Frame-Objekten uebereinander an, von denen man das aktive mit tkraise() in den Fordergrund hebt. Ausserdem eine Zustandsvariable, die festlegt, wo im Ablauf man sich gerade befindet, und die dann durch entsprechende Ereignisse wie zB einem Knopf in der Namenseingabe veraendert wird. Aber nur, wenn da auch ein Name vergeben wurde!
Code: Alles auswählen
import tkinter as tk
class Page(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
def show(self):
self.lift()
class Page1(Page):
def __init__(self, *args, **kwargs,):
Page.__init__(self, *args, **kwargs)
label = tk.Label(self, text="This is page 1")
label.pack(side="top", fill="both", expand=True)
class Page2(Page):
def __init__(self, *args, **kwargs):
Page.__init__(self, *args, **kwargs)
label = tk.Label(self, text="This is page 2")
label.pack(side="top", fill="both", expand=True)
class Page3(Page):
def __init__(self, *args, **kwargs):
Page.__init__(self, *args, **kwargs)
label = tk.Label(self, text="This is page 3")
label.pack(side="top", fill="both", expand=True)
class Page4(Page):
def __init__(self, *args, **kwargs):
Page.__init__(self, *args, **kwargs)
label = tk.Label(self, text="This is page 4")
label.pack(side="top", fill="both", expand=True)
class MainView(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
p1 = Page1(self)
p2 = Page2(self)
p3 = Page3(self)
p4 = Page4(self)
buttonframe = tk.Frame(self)
container = tk.Frame(self)
buttonframe.pack(side="top", fill="x", expand=False)
container.pack(side="top", fill="both", expand=True)
p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
p3.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
p4.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
b1 = tk.Button(buttonframe, text="Page 1", command=p1.show)
b2 = tk.Button(buttonframe, text="Page 2", command=p2.show)
b3 = tk.Button(buttonframe, text="Page 3", command=p3.show)
b4 = tk.Button(buttonframe, text="Page 4", command=p4.show)
b1.pack(side="left")
b2.pack(side="left")
b3.pack(side="left")
b4.pack(side="left")
p1.show()
def main():
root = tk.Tk()
root.title("Title")
main = MainView(root)
main.pack(side="top", fill="both", expand=True)
root.wm_geometry("400x400")
root.mainloop()
if __name__ == '__main__':
main()
Vll habe ich hier wieder einen Denkfehler, aber bisher sind diese Strings nicht gespeichert, sondern werden anhand der print-Funktion Zeile für Zeile ausgegeben. Wenn ich die über ein Label ausgeben möchte, dann muss ich die doch zuerst in einer Variablen speichern, oder nicht? Auf diese Weise könnte ich doch auch ein Label anlegen, welches später auf mehrere Variablen bzw. Strings zugreift. Die print-Funktion würde dann in der Programmlogik entfallen.