Forum >> Programmazione Python >> GUI >> Creazione bottoni tkinter

Pagina: 1

Buonasera,
Sono alcuni giorni che sto cercando un modo per creare bottoni in tkinter a partire da un ciclo for. La prima cosa che mi è venuta in mente è stata:

<codice>

from tkinter import *




root = Tk()




row = 1

column = 1




for i in range (1, 626):

i = Button(root)

i.grid(row = row, column = column)




column += 1




if column == 25:

column = 1

row +=1

</codice>




Questa soluzione però porta a due problemi:

1. Non riesco ad accedere successivamente ai widget così creati (ad esempio per modificarli);

2. Non riesco ad assegnare un comando ai bottoni.




Immagino che la la soluzione sia un array, ma non saprei bene come fare.




Grazie per l'attenzione
Sì, questo però non c'entra niente con tkinter... è Python di base. Quando, all'interno di un ciclo for, assegni dei valori via via diversi a una stessa variabile, ovviamente a ogni nuovo ciclo la variabile punta al nuovo valore che assegni, perdendosi per strada il precedente. Alla fine del ciclo, la variabile contiene solo l'ultimo valore che ha ricevuto. Quindi, quando fai:

>>> class FakeButton: pass
>>> for i in range(10):
        fb = FakeButton()

>>> fb
<class FakeButton instance at....>
Adesso la tua variabile "fb" contiene solo l'ultimo FakeButton istanziato, mentre ovviamente i precedenti nove si sono persi nel garbage collector. Ovviamente quando queste robe sono dei pulsanti fisici in tkinter, tu continui a vederli disegnati, e loro continuano a funzionare... perché non sono davvero oggetti Python... ma comunque tu non ha nessuna possibilità di raggiungerli da Python.


La soluzione, ovviamente, è quella di raccogliere le istanze create in una struttura-dati che ti fa comodo... una lista, un dizionario... quello che ti serve. Per dire:
>>> class FakeButton: pass
>>> my_buttons = []
>>> for i in range(10):
        my_buttons.Append(FakeButton())

>>> my_buttons
[<class FakeButton instance at...>, <class FakeButton instance at...>, ...]


Sì, questo però non c'entra niente con tkinter... è Python di base. Quando, all'interno di un ciclo for, assegni dei valori via via diversi a una stessa variabile, ovviamente a ogni nuovo ciclo la variabile punta al nuovo valore che assegni, perdendosi per strada il precedente. Alla fine del ciclo, la variabile contiene solo l'ultimo valore che ha ricevuto. Quindi, quando fai:

>>> class FakeButton: pass
>>> for i in range(10):
        fb = FakeButton()

>>> fb
<class FakeButton instance at....>
Adesso la tua variabile "fb" contiene solo l'ultimo FakeButton istanziato, mentre ovviamente i precedenti nove si sono persi nel garbage collector. Ovviamente quando queste robe sono dei pulsanti fisici in tkinter, tu continui a vederli disegnati, e loro continuano a funzionare... perché non sono davvero oggetti Python... ma comunque tu non ha nessuna possibilità di raggiungerli da Python.


La soluzione, ovviamente, è quella di raccogliere le istanze create in una struttura-dati che ti fa comodo... una lista, un dizionario... quello che ti serve. Per dire:
>>> class FakeButton: pass
>>> my_buttons = []
>>> for i in range(10):
        my_buttons.Append(FakeButton())

>>> my_buttons
[<class FakeButton instance at...>, <class FakeButton instance at...>, ...]


Buongiorno,
Grazie mille per la risposta! Riguarderò il mio programma e cercherò di risolvere :)


Pagina: 1



Esegui il login per scrivere una risposta.