¿Cómo obtengo el valor de un checkbox (Checkbutton) en tkinter?
Un Checkbutton no guarda su estado de una forma que puedas leer directamente. Asóciale una variable al construirlo y pregúntale a la variable: .get() sobre el checkbutton no es como funciona este widget.
import tkinter as tk
root = tk.Tk()
subscribe = tk.BooleanVar()
tk.Checkbutton(root, text="Enviarme correos", variable=subscribe).pack()
def save():
if subscribe.get(): # True o False
print("suscrito")
tk.Button(root, text="Guardar", command=save).pack()
root.mainloop() IntVar, BooleanVar o tus propios valores
Un IntVar te da 1 cuando está marcado y 0 cuando no, que es la pareja de siempre y se lee bien dentro de un if. Un BooleanVar te da True y False, que suele quedar más claro en el punto de uso y conviene preferir en código nuevo.
Cuando el valor tiene que ser otra cosa —un texto para guardar, o un código para enviar— onvalue y offvalue deciden qué guarda la variable en cada estado, y el tipo de la variable tiene que corresponder con los valores que elijas.
ticked = tk.IntVar() # 1 / 0
ticked = tk.BooleanVar() # True / False
size = tk.StringVar(value="no")
tk.Checkbutton(root, text="Envolver para regalo", variable=size,
onvalue="yes", offvalue="no")Por qué un onvalue/offvalue recién creado no es ninguno de los dos
Una variable empieza en su propio valor por defecto, no en tu offvalue. Un StringVar con onvalue="yes" y offvalue="no" se lee como la cadena vacía hasta el primer clic, así que comparar con == "no" da falso aunque la casilla esté claramente sin marcar. Dale a la variable el valor de apagado al crearla y los dos coinciden desde el principio.
size = tk.StringVar(value="no") # no solo tk.StringVar()Reaccionar en cuanto se marca
Un command se ejecuta después de que la variable se actualizó, así que puede leer el estado nuevo de inmediato. Es la forma habitual de habilitar o deshabilitar un campo que solo tiene sentido cuando la casilla está marcada.
A diferencia de los radio buttons, los checkbuttons son independientes por defecto: si no pones variable, tkinter le da a cada uno la suya, y no se estorban entre sí. Eso es cómodo hasta el momento en que quieres leer uno.
def on_toggle():
print("ahora", subscribe.get())
tk.Checkbutton(root, text="Enviarme correos", variable=subscribe, command=on_toggle)Marcarlo y desmarcarlo desde el código
Escribe en la variable y la marca la sigue, que es como restauras opciones guardadas al abrir una ventana. El widget también tiene .select(), .deselect() y .toggle(), pero pasar por la variable mantiene una sola fuente de verdad.
subscribe.set(True) # marcarlo
subscribe.set(False) # desmarcarlo Hacerlo sin buscarlo
Coloca un Checkbutton y la exportación le crea un IntVar y lo conecta, así que el valor se puede leer desde la primera ejecución. Los manejadores son stubs en la misma clase, que es donde corresponde llamar a .get().
Diseña la ventana visualmente y ve el código Python generado sobre la marcha.
Abrir el diseñador de tkinter →