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