Topic: Tkinter loop frame - problema  (Letto 62 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline mattemio

  • python unicellularis
  • *
  • Post: 1
  • Punti reputazione: 0
    • Mostra profilo
Tkinter loop frame - problema
« il: Aprile 12, 2020, 13:59 »
Buongiorno a tutti ragazzi.
Ho iniziato da poco ad interessarmi lla programmazione quindi vi chiedo scusa qualora il problema che vi sottopongo sia di banale risoluzione.
Ecco il codice in questione:

from tkinter import *
class months():
    def __init__ (self,name,days_of_the_month,year):
        months.name = name
        months.days = days_of_the_month
        months.year = year
 
root = Tk()
january= months('January',31,2020)
february= months('February',29,2020)
december= months('December',31,2020)
 
months_list = [january,february,december]
 
for i in range(len(months_list)):
    new_LabelFrame = LabelFrame(root,text= months_list[i].name)
    new_LabelFrame.pack()
    new_label = Label(new_LabelFrame,text ='Name: {}\nDays: {}\nYear: {}'.format(months_list[i].name,months_list[i].days,months_list[i].year))
    new_label.pack()
 
root.mainloop()


Il problema è che in ognuna delle 3 labelframe mi scrive solo gli attributi dell'ultima istanza nella lista (dicembre).
Sapete spiegarmi il perchè e dirmi come potrei risolvere?
Vi ringrazio, e buona pasqua!

Offline nuzzopippo

  • python erectus
  • ***
  • Post: 231
  • Punti reputazione: 0
    • Mostra profilo
Re:Tkinter loop frame - problema
« Risposta #1 il: Aprile 12, 2020, 15:22 »
...

from tkinter import *
class months():
    def __init__ (self,name,days_of_the_month,year):
        months.name = name
        months.days = days_of_the_month
        months.year = year
...


Il problema è che in ognuna delle 3 labelframe mi scrive solo gli attributi dell'ultima istanza nella lista (dicembre).
Sapete spiegarmi il perchè e dirmi come potrei risolvere?

Ciao @mattemio, buona pasqua a Te (ed a tutto Forum)

Il perché è presto detto : per come le hai dichiarate, name, days e year sono variabili di classe, ossia attributi condivisi da tutte le istanze della classe che li dichiara, ciò comporta che una eventuale modifica di tali variabili di classe si replica in tutte le istanze della classe, esattamente ciò che Ti capita, sotto un esempio "al volo"

>>> class months():
def __init__(self, name, days_of_the_month, year):
months.name = name
months.days = days_of_the_month
months.year = year


>>> gennaio = months('January', 31, 2020)
>>> print(gennaio.name, gennaio.days, gennaio.year)
January 31 2020
>>> febbraio = months('February', 29, 2020)
>>> print(febbraio.name, febbraio.days, febbraio.year)
February 29 2020
>>> print(gennaio.name, gennaio.days, gennaio.year)
February 29 2020

Come vedi, quando ho impostato i dati per la variabile "febbraio" ho modificato anche quelli della variabile "gennaio".

Per tenere "separate" le variabili di una classe tra istanze diverse devi dichiararle quali variabili di istanza, ciò si fa precedendo con "self." il nome della variabile, esemplificando :
>>> class months():
def __init__(self, name, days_of_the_month, year):
self.name = name
self.days = days_of_the_month
self.year = year


>>> gennaio = months('January', 31, 2020)
>>> print(gennaio.name, gennaio.days, gennaio.year)
January 31 2020
>>> febbraio = months('February', 29, 2020)
>>> print(febbraio.name, febbraio.days, febbraio.year)
February 29 2020
>>> print(gennaio.name, gennaio.days, gennaio.year)
January 31 2020
>>> 

Come vedi, ridefinendo le dichiarazioni delle variabili come indicato, le impostazioni di una nuova instanza non sovrascrivono quelle delle istanze precedenti. Maggiori dettagli nella docs
« Ultima modifica: Aprile 12, 2020, 15:26 da nuzzopippo »