Problem z odwołaniem się i update_idletasks(), podczas używania klas w tkinter

0

Witam, chciałem stworzyć funkcje, która odświeżała by Labely czy Buttony, lecz nie umiem się odwołać do owych rzeczy.
Używając klas w nieco inny sposób, nie miałem mniejszego problemu by użyć update_idletasks(),

myapp.helmetButton.config(text=helmetSlot.item.name)
    myapp.helmetButton.update_idletasks()

lecz teraz nie wiem jak się do tego zabrać.
Użyłem kodu, znalezionego w internecie, który pozwala mi zmieniać framy.

class greatGame(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        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 (CharacterPage, PageOne, PageTwo):
            frame = F(container, self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(CharacterPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


class CharacterPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        menucontainer = tk.Frame(self)
        menucontainer.grid(column=0,row=0)

        goldLabel = tk.Label(menucontainer, text="gold")
        goldLabel.grid(column=4, row=1)

I to końcówka

app = greatGame()
app.mainloop()

I załóżmy, że chciałbym zmienić tekst w goldLabel z "gold" na "silver" czy cokolwiek innego. Jak sie do tego zabrać?
bo tak:

goldLabel.config(text="silver")
goldLabel.update_idletasks()

nie da rady(nie wiem jak sie odwołać do tego.)

1

W sumie wkleję fragment kodu w którym już komuś kiedyś odpowiadałem na to pytanie.
Na klasach jest łatwiej, mniej kombinowania niż tutaj z modyfikacją słownika wewnątrz funkcji, co ma odbicie poza funkcją.

Wystarczy że zmienną którą chcesz zrekonfigurować, poprzedzisz parametrem self. aby była widoczna w każdej metodzie klasy, a później wywołasz ją jak będzie to potrzebne.

from tkinter import *

okno=Tk()
okno.title("Powitanie")
lista=[]
imnz=StringVar()
welcome_label = {}

def zatwierdz(welcome_label):
    dane1=a.get()
    dane2=b.get()
    lista.append(dane1+" "+dane2)
    imnz=(dane1+" "+dane2)
    #print(welcome_label)
    if welcome_label:
        welcome_label["l"].config(text="Witaj "+imnz)
    else:
        welcome_label["l"] = Label(text="Witaj "+imnz)
        welcome_label["l"].grid(row=4, column=0)
    print(lista)

a=StringVar()
b=StringVar()
Label(text="Podaj swoje imie :") .grid(row=0,column=0)
Entry(textvariable=a).grid(row=0, column=1)
Label(text="Podaj swoje Nazwisko :") .grid(row=1,column=0)
Entry(textvariable=b).grid(row=1, column=1)
Button(text="Zatwierdź", command=lambda: zatwierdz(welcome_label)).grid(row=2,column=0)


okno.mainloop()

/\ Powyżej przedstawiony w kodzie rozwiązany problem też można rozwiązać domknięciem zamiast lambdą i słownikiem.
Jest to tylko przeróbka kodu użytkownika - nie zalecam braku przypisywania do zmiennych obiektów tk.

0

Dalej nie mogę się odwołać, mimo że dodam "self", to dalej nie moge użyć przykładowo

myGame.sampleButton.update_idletasks()

Wykrywa sampleButton, lecz cokolwiek dam dalej, wyskakuje, że nie jest to element tej klasy.
Tak to mnie więcej wygląda u mnie

class CharacterPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        characterContainer = tk.Frame(self)
        characterContainer.config(relief="groove", borderwidth=2)
        characterContainer.grid(column=0, row=1)
       
        self.avatarImage = tk.PhotoImage(file=myChar.avatar)
        self.avatarLabel = tk.Label(characterContainer, image=self.avatarImage)
        self.avatarLabel.image = self.avatarImage

i tak przed deklaracja CharacterPage, nie dam rady się odwołać do przykładowo avatarLabel.
Dam CharacterPage.avatarLabel... i dalej nie da się nic zrobić(tak jakby avatarLabel nie istniał)

Przy okazji, czemu lepiej importwać tkinter as tk a nie import *(all)?

1 użytkowników online, w tym zalogowanych: 0, gości: 1