Topic: Dubbio sulle classi  (Letto 463 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Blackeyes972

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Dubbio sulle classi
« il: Agosto 28, 2022, 12:56 »
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?
« Ultima modifica: Agosto 28, 2022, 12:59 da Blackeyes972 »

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.723
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:Dubbio sulle classi
« Risposta #1 il: Agosto 29, 2022, 17:27 »
Non hai mai settato su self un campo di nome bt2

Offline Blackeyes972

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:Dubbio sulle classi
« Risposta #2 il: Settembre 10, 2022, 15:35 »
Non hai mai settato su self un campo di nome bt2
cosi non basta?
bt2 = tk.Button(self, text="Start")

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.723
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:Dubbio sulle classi
« Risposta #3 il: Settembre 13, 2022, 11:38 »
no

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 677
  • Punti reputazione: 0
    • Mostra profilo
Re:Dubbio sulle classi
« Risposta #4 il: Settembre 13, 2022, 12:06 »
Non hai mai settato su self un campo di nome bt2
cosi non basta?
bt2 = tk.Button(self, text="Start")

Bem dice @GlenHK, è un problema di namespace, Ti è dato dalla visibilità di bt2 che viene persa al di fuori della funzione "__init__", dove è definito, dovresti rendere bt2 variabile di istanza tieni presente, inoltre, che self.bt2 NON è bt2

Offline Blackeyes972

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:Dubbio sulle classi
« Risposta #5 il: Settembre 14, 2022, 19:11 »
Non hai mai settato su self un campo di nome bt2
cosi non basta?
bt2 = tk.Button(self, text="Start")

Bem dice @GlenHK, è un problema di namespace, Ti è dato dalla visibilità di bt2 che viene persa al di fuori della funzione "__init__", dove è definito, dovresti rendere bt2 variabile di istanza tieni presente, inoltre, che self.bt2 NON è bt2
capito grazie