2011-12-16 48 views
6

Tengo una lista de longitud variable y quiero crear una casilla de verificación (con Python TKinter) para cada entrada en la lista (cada entrada corresponde a una máquina que debe activarse o desactivarse con la casilla de verificación -> cambiar el valor en el diccionario).Cómo creo varias casillas de verificación de una lista en un ciclo for en python tkinter

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

(ejemplo, puede ser de cualquier longitud)

ahora el código relevante:

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

Este código produce 4 casillas de verificación pero todos ellos son ya sea marcada o sin marcar juntos y los valores de la enable dict no cambian. ¿Cómo resolver? (Creo que el l no funciona, pero ¿cómo hacer esta variable?)

Respuesta

12

La "variable" que se pasa a cada botón de verificación debe ser una instancia de la variable Tkinter, ya que solo tiene el valor "0 "eso se pasa, y esto causa la mala conducta".

Puede crear las instancias Tkinter.Variable en él mismo para crear el bucle que checkbuttons - acaba de cambiar el código para:

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

self.root.mainloop() 

A continuación, puede comprobar el estado de cada casilla usando su método como en get enable["ID1050"].get()

+0

¡Gracias! Las casillas de verificación funcionan ahora, solo una pregunta: ¿cómo puedo leer las variables fuera de la clase tkinter (lo tengo configurado como en: http://stackoverflow.com/a/1835036/1102225). Intenté todo. Cuando uso 'print enable [machine] .get() AttributeError: el objeto 'int' no tiene ningún atributo 'get'' Así que probé: ' print app.enable [máquina] .get() AttributeError:' MyTkApp 'objeto no tiene atributo' enable'' (aplicación es el objeto de la clase tkinter llama MyTkApp) Y cuando lo hago sin el get: habilitar 'impresión [máquina] PY_VAR0' – Sebastian

+0

Oh lo tengo yo! He incluido una función en la clase tkinter para devolver el valor: 'def leer (sí, la máquina): \t retorno permiten [máquina] .get()' luego fuera de la clase se puede, por ejemplo, simplemente llame a: ' imprima la aplicación.read (1050) ' – Sebastian

1

Sólo pensé en compartir mi ejemplo de una lista en lugar de un diccionario:

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() 

Espero que ayude

Cuestiones relacionadas