2011-12-16 16 views
6

Ho una lista di lunghezza variabile e voglio creare una checkbox (con python TKinter) per ogni voce nella lista (ogni voce corrisponde ad una macchina che dovrebbe essere attivato o disattivato con la casella di controllo -> modifica del valore nel dizionario).Come creare più checkbox da un elenco in un ciclo for in python tkinter

print enable 
{'ID1050': 0, 'ID1106': 0, 'ID1104': 0, 'ID1102': 0} 

(esempio, può essere di qualsiasi lunghezza)

ora il codice rilevante:

for machine in enable: 
    l = Checkbutton(self.root, text=machine, variable=enable[machine]) 
    l.pack() 
self.root.mainloop() 

Questo codice produce 4 caselle ma sono tutti sia selezionata o deselezionata insieme ei valori nella enable dict non cambia. Come risolvere? (Credo che il l non funziona, ma come fare questo una variabile?)

risposta

12

La "variabile" passata a ogni checkbutton deve essere un'istanza di Tkinter variabile - così com'è, è solo il valore "0 "quello è passato e questo causa il comportamento errato.

È possibile creare le istanze Tkinter.Variable in poi nello stesso ciclo for si crea il checkbuttons - basta modificare il codice per:

for machine in enable: 
    enable[machine] = Variable() 
    l = Checkbutton(self.root, text=machine, variable=enable[machine]) 
    l.pack() 

self.root.mainloop() 

È quindi possibile verificare lo stato di ogni casella di controllo utilizzando il suo metodo come in get enable["ID1050"].get()

+0

Grazie! Le caselle di controllo ora funzionano, solo una domanda: come posso leggere le variabili al di fuori della classe tkinter (l'ho configurato come in: http://stackoverflow.com/a/1835036/1102225). Ho provato di tutto. Quando utilizzo 'print enable [machine] .get() AttributeError: 'oggetto' int 'non ha attributo' get'' Quindi ho provato: ' print app.enable [machine] .get() AttributeError: 'MyTkApp 'oggetto non ha attributo' abilita'' (l'app è l'oggetto della classe tkinter chiamata MyTkApp) E quando lo faccio senza ottenere: 'abilita stampa [macchina] PY_VAR0' – Sebastian

+0

Oh ce l'ho fatta io! Ho incluso una funzione nella classe tkinter per restituire il valore: 'def read (auto, macchina): \t return enable [machine] .get() ' quindi al di fuori della classe è possibile ad esempio solo chiamare: ' stampa app.read (1050) ' – Sebastian

1

ho pensato di condividere il mio esempio per una lista invece di un dizionario:

from Tkinter import * 

root = Tk()  

users = [['Anne', 'password1', ['friend1', 'friend2', 'friend3']], ['Bea', 'password2', ['friend1', 'friend2', 'friend3']], ['Chris', 'password1', ['friend1', 'friend2', 'friend3']]] 

for x in range(len(users)): 
    l = Checkbutton(root, text=users[x][0], variable=users[x]) 
    print "l = Checkbutton(root, text=" + str(users[x][0]) + ", variable=" + str(users[x]) 
    l.pack(anchor = 'w') 

root.mainloop() 

Spero che aiuti

Problemi correlati