Frames in TKinter aktualisieren

Fragen zu Tkinter.
Antworten
ExiZzy
User
Beiträge: 3
Registriert: Donnerstag 9. Januar 2020, 21:54

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...
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hat der Code mit Deiner Beschreibung zu tun? Kannst Du ein vollständiges Beispiel posten, das Dein Problem zeigt?
ExiZzy
User
Beiträge: 3
Registriert: Donnerstag 9. Januar 2020, 21:54

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()
ExiZzy
User
Beiträge: 3
Registriert: Donnerstag 9. Januar 2020, 21:54

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)
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

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