Seite 1 von 1
Frames in TKinter aktualisieren
Verfasst: Donnerstag 9. Januar 2020, 22:06
von ExiZzy
Guten Tag, ich bin gerade dabei mein erstes Programm zu schreiben und möchte diesen auch ein passendes GUI erstellen. Die Funktionen sind alle fertig und es müssen nur noch wenige integriert werden. Jetzt zu meinen Problem.
Ich habe mich dazu entschieden Frames in einen Container zu platzieren damit das Programm zwischen diesen hin und her springt. Das Programm selbst hat hierbei die Aufgabe zu zählen. Die Frames werden dabei aber nicht aktualisiert. Es bleibt nur die erste Zahl stehen.
Aufbau:
1. Frame:Menü
-Knopf:+1
-Knopf: -1
2. Frame:Anzeigen der Gesamtzahl
-Knopf: zurück
Ich habe mit lambda gearbeitet und befürchte, dass es damit zusammenhängt. Kann mir jemand helfen?
So wechsel ich zurzeit zwischen den Frames:
Code: Alles auswählen
class Menu(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
lab1 = tk.Label(self,text="Hauptmenü")
Knopf1=tk.Button(self,text="+1", command=lambda: controller.show_frame("GZ"))
Ich bekomme es auch nicht die +1 mit auf den Knopf zu legen...
Re: Frames in TKinter aktualisieren
Verfasst: Donnerstag 9. Januar 2020, 22:17
von Sirius3
Was hat der Code mit Deiner Beschreibung zu tun? Kannst Du ein vollständiges Beispiel posten, das Dein Problem zeigt?
Re: Frames in TKinter aktualisieren
Verfasst: Freitag 10. Januar 2020, 17:08
von ExiZzy
Code: Alles auswählen
Zahl=0
class Test(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title_font = tkfont.Font(family='Arial Black', size=30)
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 (Menu, Ergebnis):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame("Menu")
def show_frame(self, page_name):
frame = self.frames[page_name]
frame.tkraise()
self.title("Test")
#---------------- Meine Versuche den Frame per Funktion zu ändern und mit dem selben Knopf eine Variable zu ändern, welche dann aktualisiert angezeigt werden soll.
def OpenWindow1(x):
global Zahl
Zahl=Zahl+1
x.show_frame("Ergebnis")
def OpenWindow2(x):
global Zahl
Zahl=Zahl-1
x.show_frame("Ergebnis")
#----------------
class Menu(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
lab1 = tk.Label(self,text="Hauptmenü")
Knopf1=tk.Button(self,text="+1", command=lambda: controller.show_frame("Ergebnis")) #Suche hier eine Möglichkeit auf Knopfdruck die Variable zu verändern mittels der Funktion und den Frame aktualisiert anzuzeigen.
Knopf2=tk.Button(self,text="-1", command=lambda: controller.show_frame("Ergebnis")) #Suche hier eine Möglichkeit auf Knopfdruck die Variable zu verändern mittels der Funktion und den Frame aktualisiert anzuzeigen.
lab1.pack(pady=20)
Knopf1.pack()
Knopf1.config(width = 20)
Knopf2.pack()
Knopf2.config(width = 20)
class Ergebnis(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
lab1 = tk.Label(self,text=Zahl)
Knopf1=tk.Button(self,text="Okay!", command=lambda: controller.show_frame("Menu"))
lab1.pack()
Knopf1.pack()
if __name__ == "__main__":
app=Test()
app.mainloop()
Re: Frames in TKinter aktualisieren
Verfasst: Freitag 10. Januar 2020, 22:55
von ExiZzy
Ich habe es jetzt mit einer Update Funktion hinbekommen.
Code: Alles auswählen
def update():
lab1.config(text=Zahl)
self.after(100, update)
self.after(100, update)
Re: Frames in TKinter aktualisieren
Verfasst: Sonntag 12. Januar 2020, 11:49
von Sirius3
Eine Klasse die nur aus __init__ besteht und keine Attribute hat, ist eigentlich keine Klasse. `Menu` und `Ergebnis`. Die beiden Frames sind auch so eng miteinander verknüpft, dass ich kaum eine Trennung sehen kann. `OpenwWindow1` und `Openwindow2` werden nicht benutzt.
`global` solltest Du nicht benutzen. Variablen nicht abkürzen oder kryptische Einbuchstabige Namen benutzen.
Code: Alles auswählen
from functools import partial
import tkinter as tk
class Test(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.number = tk.IntVar()
menu_frame = tk.Frame(self)
tk.Label(menu_frame, text="Hauptmenü").pack(pady=20)
tk.Button(menu_frame, text="+1", command=partial(self.change, +1), width=20).pack()
tk.Button(menu_frame, text="-1", command=partial(self.change, -1), width=20).pack()
menu_frame.grid(row=0, column=0, sticky="nsew")
ergebnis_frame = tk.Frame(self)
tk.Label(ergebnis_frame, textvariable=self.number).pack()
tk.Button(ergebnis_frame, text="Okay!", command=partial(self.show_frame, "Menu")).pack()
ergebnis_frame.grid(row=0, column=0, sticky="nsew")
self.frames = {
"Menu": menu_frame,
"Ergebnis": ergebnis_frame,
}
self.show_frame("Menu")
def show_frame(self, page_name):
frame = self.frames[page_name]
frame.tkraise()
def change(self, amount):
self.number.set(self.number.get() + amount)
self.show_frame("Ergebnis")
if __name__ == "__main__":
app = Test()
app.mainloop()