[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