Salve a tutti,
ho scritto questo piccolo script per capire le classi
import threading
import tkinter as tk
import time
from threading import *
class App(tk.Tk):
#Creo il costruttore e lo istanzio
def __init__(self):
super().__init__()
self.title("App multi pannello")
self.geometry("600x300")
#Creo un frame che deve espandersi per tutto lo spazio
self.container = tk.Frame(self)
self.container.pack(fill=tk.BOTH, expand=True)
self.container.grid_rowconfigure(0, weight=1)
self.container.grid_columnconfigure(0, weight=1)
#creo i pannelli che aggancio al frame
self.page1 = Page1(self.container, self)
self.page1.grid(row=0, column=0, sticky="nswe")
self.page2 = Page2(self.container, self)
self.page2.grid(row=0, column=0, sticky="nswe")
#Definisco quale pannello debba essere visualizzato per primo
self.show_frame(0)
#Creo la funzione show_frame
def show_frame(self, idx):
if idx == 0:
self.page1.tkraise() #porta in primo piano il pannello
elif idx == 1:
self.page2.tkraise()
class Page1(tk.Frame):
#Creo il costruttore e lo istanzio
def __init__(self, container, controller):
super().__init__(container)
#Assegno un colore al frame
self['background'] = "red"
label = tk.Label(self, text="Page1")
label.pack()
bt = tk.Button(self, text="Go to Page2")
bt["command"] = lambda: controller.show_frame(1)
bt.pack()
bt2 = tk.Button(self, text="Start")
bt2["command"] = self.doWork
bt2.pack()
self.txt = tk.Label(self)
self.txt.pack()
def doWork(self):
# self.bt2["state"] = 'disabled'
t1 = Thread(target=self.work)
t1.setDaemon(True)
t1.start()
def work(self):
for i in range(10):
self.txt["text"] = str(i)
time.sleep(1)
self.txt["text"] = "Finito"
# self.bt2["state"] = 'active'
class Page2(tk.Frame):
#Creo il costruttore e lo istanzio
def __init__(self, container, controller):
super().__init__(container)
#Assegno un colore al frame
self['background'] = "yellow"
label = tk.Label(self, text="Page2")
label.pack()
bt = tk.Button(self, text="Go to Page1")
bt["command"] = lambda: controller.show_frame(0)
bt.pack()
if __name__ == "__main__":
app = App()
app.mainloop()
In questo modo funziona ma se tolgo i commenti al comando self.bt2["state"] = 'disabled' nella funzione doWork ricevo un errore AttributeError: 'Page1' object has no attribute 'bt2'
Stessa cosa accade per la funzione work, cosa mi sfugge?