¿Se puede simplificar el código del Checkbutton en tkinter? [SOLUCIONADO] :)

Iniciado por Yidu, 9 Julio 2017, 18:21 PM

0 Miembros y 1 Visitante están viendo este tema.

Yidu

Hola de nuevo!  :D

Llevo un tiempo haciendo programas de Python en consola. Ahora me he decidido por usar una GUI. Y me he decantado por tkinter. He ido conociendo un poco los widgets y con el Checkbutton me han asaltado unas dudas:

En casi todos los ejemplos se crean unos pocos Checkbutton. Para cada uno de ellos se debe crear la variable de su estado y una función (normalmante llamada por command del widget Button). Pero claro, si queremos crear, por ejemplo, diez o veinte Checkbutton la cosa se desmadra y se crea un código redundante y repetitivo.

Ejemplo:

Código (python) [Seleccionar]
def imprime():
   global lista
   lista = []
   if _1.get() == 1:
       lista.append(1)
   if _2.get() == 1:
       lista.append(2)
   if _3.get() == 1:
       lista.append(3)
   if _4.get() == 1:
       lista.append(4)
   if _5.get() == 1:
       lista.append(5)
   if _6.get() == 1:
       lista.append(6)
   if _7.get() == 1:
       lista.append(7)
   if _8.get() == 1:
       lista.append(8)
   if _9.get() == 1:
       lista.append(9)
   if _10.get() == 1:
       lista.append(10)
_1 = IntVar()
_2 = IntVar()
_3 = IntVar()
_4 = IntVar()
_5 = IntVar()
_6 = IntVar()
_7 = IntVar()
_8 = IntVar()
_9 = IntVar()
_10 = IntVar()
chk1 = Checkbutton(ventana, text = '1', variable = _1, onvalue = 1, offvalue = 0).place(x = 10, y = 30)
chk2 = Checkbutton(ventana, text = '2', variable = _2, onvalue = 1, offvalue = 0).place(x = 10, y = 60)
chk3 = Checkbutton(ventana, text = '3', variable = _3, onvalue = 1, offvalue = 0).place(x = 10, y = 90)
chk4 = Checkbutton(ventana, text = '4', variable = _4, onvalue = 1, offvalue = 0).place(x = 10, y = 120)
chk5 = Checkbutton(ventana, text = '5', variable = _5, onvalue = 1, offvalue = 0).place(x = 10, y = 150)
chk6 = Checkbutton(ventana, text = '6', variable = _6, onvalue = 1, offvalue = 0).place(x = 10, y = 180)
chk7 = Checkbutton(ventana, text = '7', variable = _7, onvalue = 1, offvalue = 0).place(x = 10, y = 210)
chk8 = Checkbutton(ventana, text = '8', variable = _8, onvalue = 1, offvalue = 0).place(x = 10, y = 240)
chk9 = Checkbutton(ventana, text = '9', variable = _9, onvalue = 1, offvalue = 0).place(x = 10, y = 270)
chk10 = Checkbutton(ventana, text = '10', variable = _10, onvalue = 1, offvalue = 0).place(x = 60, y = 30)



Esto es un extracto del código. El que hace referencia a la duda que me surge. Es decir, se puede dar el caso que un programa tenga 100 casillas a seleccionar ¿Cómo se puede evitar este código tan repetitivo?

Saludos!

engel lex

no se porque tienes variables _1, _2 en lugar de usar un array

mi solución sería (asumiendo que en lugar _1, _2 tienes un array con sus elementos
Código (python) [Seleccionar]


def imprime(elementos):
lista = []
maximo_y = 9
chk = []
for i in range(len(elementos)):
  if elementos[i].get() == 1:
   lista.append(i+1)   
  elementos[i] = IntVar()
chk.append( Checkbutton(ventana, text = str(i), variable = elementos[i], onvalue = 1, offvalue = 0).place(x = int(i/maximo_y)*50+10, y = (i%maximo_y)*30+30) )


lo estoy haciendo a mente, así que revisa, pero la logica debería estar bien, creo
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Yidu

Muchas gracias por el script  :D

Me imaginaba, que no era lógico, poner tantos IFs y líneas repetitivas. Vi unos ejemplos donde su autor explicaba, de alguna manera, el Checkbutton. Claro esta que en su ejemplo eran solo tres Checkbutton. Pero claro, si uno debe poner cien (por ejemplo), tarde o temprano se las tiene que ingeniar con un algoritmo como el tuyo. Le echado un vistazo por encima y creo que debe estar bien. Eso sin contar que luego recomiendan usar la OOP para usar tkinter.

Para familiarizarme con tkinter estaba creando un simple escrutador de loteria primitiva. Aquí una captura:



Al final, el tema de la ubicación de los Checkbutton lo he solucionado en el siguiente script. Seguramente tu método será mejor. Pero a mi me gusta (aunque sean mas lineas) que el código no quede tan compacto.  Lo digo en referencia del método place().

Código (python) [Seleccionar]
# Creacion de los Checkbutton
varsCheck =[]
coord_x, coord_y = 10, 60 # Coordenadas iniciales
for i in range(0, 49):
    varsCheck.append(IntVar())     
    Checkbutton(ventana, text = str(i + 1), variable = varsCheck[i], onvalue = 1, offvalue = 0).place(x = coord_x, y = coord_y)   
    coord_y += 30   
    if coord_y > 300:
        coord_y = 30
        coord_x += 50