Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Mostrar u ocultar un entry desde un checkbutton (tkinter)
#1
Buenas, tengo el siguiente código:

import tkinter
from tkinter import *
from tkinter import ttk
root = tkinter.Tk()
caso1_radio = ttk.Checkbutton(root, text= "Caso 1:")
caso1_radio.place(x=0, y=30)
caso1_entry = Entry(root)
caso1_entry.place(x=70, y=30)
caso2_radio = ttk.Checkbutton(root, text="Caso 2:")
caso2_radio.place(x=0, y=50)
caso2_entry = Entry(root)
caso2_entry.place(x=70, y=50)
root.mainloop()


Estoy intentando hacer que los entrys aparezcan sólo cuando el checkbutton esté tildado, y si no lo está, que queden ocultos. Pero no lo logro.
Lo más cercano que encontré es esto:  [tkinter] Habilitar/deshabilitar un Entry con un checkbutton (recursospython.com), pero no es exactamente lo que estoy buscando ya que no quiero que el cajón del entry se muestre si el tilde no está puesto en el check.
¿Cómo puedo tomar el estado del checkbutton como para poner un condicional y habilitar o no el entry? ¿O se hace de otra manera?
Responder
#2
Hola, Diego.

Podés usar algo así:

Código:
import tkinter as tk
from tkinter import ttk

def mostrar_u_ocultar_entry():
    if caso1_radio_value.get():
        caso1_entry.place(x=70, y=30)
    else:
        caso1_entry.place_forget()

root = tk.Tk()
caso1_radio_value = tk.BooleanVar(value=True)
caso1_radio = ttk.Checkbutton(root, text="Caso 1:", variable=caso1_radio_value)
caso1_radio.place(x=0, y=30)
caso1_entry = ttk.Entry(root)
caso1_entry.place(x=70, y=30)
caso1_radio.config(command=mostrar_u_ocultar_entry)
root.mainloop()

Más información sobre el checkbutton: https://recursospython.com/guias-y-manua...k-tkinter/.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
Muchísimas gracias, Francisco.
Como tengo muchos entrys presentes en la vista (+ de 10) se me ocurrió crear una función genérica, para no tener que repetir la función por cada entry que deba poner.
Hice esto:

Código:
import tkinter
from tkinter import *
from tkinter import ttk

#Prueba con función genérica:
def mostrar_u_ocultar_entry_x(casox_var, entry, a, b):
    if casox_var.get():
        entry.place(x=a, y=b)
    else:
        entry.place_forget()

root = tkinter.Tk()
caso1_var = tkinter.BooleanVar()
caso1_radio = ttk.Checkbutton(root, text= "Caso 1:", variable=caso1_var, command=lambda: [mostrar_u_ocultar_entry_x(caso1_var, caso1_entry, 70, 30)])
caso1_radio.place(x=0, y=30)
caso1_entry = Entry(root)
caso2_var = tkinter.BooleanVar()
caso2_radio = ttk.Checkbutton(root, text="Caso 2:", variable=caso2_var, command=lambda: [mostrar_u_ocultar_entry_x(caso2_var, caso2_entry, 70, 50)])
caso2_radio.place(x=0, y=50)
caso2_entry = Entry(root)
root.mainloop()

Sé que funciona, porque lo probé, así que la pregunta que me surge tiene que ver con lo siguiente: ¿esta forma de resolverlo, es correcta desde el punto de vista de las buenas prácticas? ¿El código puede ser mejorado, o es limpio?
Responder
#4
Hola, Diego. Está excelente!

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 2 invitado(s)