[Python] gestione checkbutton
Marco Giusti
marco.giusti a gmail.com
Ven 7 Feb 2014 15:35:32 CET
On Fri, Feb 07, 2014 at 02:55:25PM +0100, Antonino Cardillo wrote:
> Salve a tutti.
> Sto usando in un piccolo programma le pygtk dove ho l'esigenza di creare
> dei checkbutton in base ad una lista che leggo da un file e nella creazione
> dinamica imposto la label con il testo letto.
> Di seguito una parte del codice in cui creo dinamicamente i checkbutton.
>
> dict_hosts=leggi_file_hosts()
> for host in dict_hosts.keys(): #leggo i vari host dal dizionario
> i+=1 #incremento il contatore
> self.check=gtk.CheckButton(host) #creo il widget check ed assegno la
> label con l'host
> if dict_hosts[host]=='True':
> self.check.set_active(True)
> else:
> self.check.set_active(False)
> self.check.connect("toggled", self.toggled, "check button %i" % i)
> #connetto alla funzione toggled il check
> self.vbox.pack_start(self.check,0,0) #inserisco nel VBox i vari check
>
>
> Fin qui tutto bene, il mio problema nasce quando voglio eliminare uno di
> questi checkbutton come faccio ad identificarli, tipo con un ciclo e
> controllo la label, ma non ho trovato in rete.
> Se avete suggerimenti anche nel modo di come ho impostato il codice sopra
> sono graditi.
Risolvi facilmente principalmente in due modi:
1. VBox eredita da Container e hai ha disposizione il metodo
get_children() che ritorna tutti i figli.
checkbox = filter(lambda w: w.get_label() == LABEL, vbox.get_children())
Volendo puoi associare dei valori arbitrari alla checkbox:
check = gtk.CheckButton(host)
check.set_active(dict_hosts[host] == 'True')
check.set_data(KEY, i)
successimante:
checkbox = filter(lambda w: w.get_data(KEY) == i, vbox.get_children())
1-bis. tieni tu una lista di riferimenti alle checkbox e poi cicli alla
stessa maniera nel caso in cui la vbox contenga moltre altre cose.
2. Invece che una lista creai un dizionario con i riferimenti, molto
ultile in caso di collezioni grosse e con frequenti accessi:
dct[i] = check
...
checkbox = dct[i]
Personalmente se non hai particolari necessità opterei per prima
soluzione, pygtk non gestisce i riferimenti ciclici e quindi eviterei di
avere troppi riferimenti ad widget.
Ed il seguente codice in realtà crea proprio un riferimento ciclico con
un widget:
self.check.connect("toggled", self.toggled, "check button %i" % i)
Piccolo extra, assegnare `self.check` non ha molto senso dentro un
ciclo, non hai bisogno di conservare il riferimento alla checkbox.
ciao
m.
Maggiori informazioni sulla lista
Python