es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo eliminar el retorno de 0 en el Radiobutton de tkinter?

Intenté desarrollar un código para GUI con Python Tkinter. Sin embargo, me encontré con un problema pero no entiendo su causa.

Cuando llamo a la función con el botón, el “Radiobutton” siempre devuelve 0.
Por otro lado, si llamo a la función sola o dentro de otra función, puedo obtener los valores.

¿Cómo puedo solucionar ese problema?

Código común:

import tkinter as tk
from tkinter import ttk

def xyzWindow():
    global xlabel
    iWidth = int(1920/2.6)
    iHeight = int(1080/3)
    iwL = int((1920-iWidth)/2)
    ihL = int((1080-iHeight)/2)
    linWin = tk.Tk()
    linWin.title("TESTING")
    linWin.geometry("{}x{}+{}+{}".format(iWidth,iHeight,iwL,ihL))
    linWin.maxsize(iWidth,iHeight)
    linWin.resizable(False,False)
    linWin.minsize(iWidth,iHeight)

    abc = tk.IntVar()
    abc.set(0)

    def ccCom():
        xlabel.configure(text = abc.get())

    xb1 = ttk.Radiobutton(linWin, text = "1 Years", value = 1, variable = abc, command = ccCom)
    xb1.pack()

    xb2 = ttk.Radiobutton(linWin, text = "3 Years", value = 2, variable = abc, command = ccCom)
    xb2.pack()

    xb3 = ttk.Radiobutton(linWin, text = "5 Years", value = 3, variable = abc, command = ccCom)
    xb3.pack()


    linWin.mainloop()

Primer código: (Funciona)

def main():
    xyzWindow()

main()

Segundo código: (No funciona)

def main():
    global xlabel
    root = tk.Tk()
    root.title("A WINDOW")
    root.geometry("400x400")

    xlabel = tk.Label(root, text = "")
    xlabel.pack()

    xbut = tk.Button(root, text = "CHECK", command = xyzWindow)
    xbut.pack()

    root.mainloop()

main()
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con el hecho de que los valores de los botones de opción se restablecen a 0 cada vez que se llama a la función xyzWindow desde el comando del botón. Para evitar esto, puedes pasar la variable IntVar (abc) como argumento a la función xyzWindow y crear los botones de opción utilizando esa variable fuera de la función. Aquí tienes un fragmento de código actualizado:

    import tkinter as tk
    from tkinter import ttk
    
    def xyzWindow(abc): # pasa el argumento IntVar
        global xlabel
        iWidth = int(1920/2.6)
        iHeight = int(1080/3)
        iwL = int((1920-iWidth)/2)
        ihL = int((1080-iHeight)/2)
        linWin = tk.Toplevel() # utiliza Toplevel en lugar de Tk para crear una nueva ventana
        linWin.title("PRUEBA")
        linWin.geometry("{}x{}+{}+{}".format(iWidth,iHeight,iwL,ihL))
        linWin.maxsize(iWidth,iHeight)
        linWin.resizable(False,False)
        linWin.minsize(iWidth,iHeight)
    
        # crea los botones de opción fuera de esta función
        xb1 = ttk.Radiobutton(linWin, text="1 Año", value=1, variable=abc)
        xb2 = ttk.Radiobutton(linWin, text="3 Años", value=2, variable=abc)
        xb3 = ttk.Radiobutton(linWin, text="5 Años", value=3, variable=abc)
    
        # empaqueta los botones de opción
        xb1.pack()
        xb2.pack()
        xb3.pack()
    
        def ccCom():
            xlabel.configure(text=abc.get())
    
        xbut = ttk.Button(linWin, text="VERIFICAR", command=ccCom)
        xbut.pack()
    
    def main():
        global xlabel
        root = tk.Tk()
        root.title("UNA VENTANA")
        root.geometry("400x400")
    
        xlabel = tk.Label(root, text="")
        xlabel.pack()
    
        abc = tk.IntVar()
        abc.set(0)
    
        xbut = tk.Button(root, text="VERIFICAR", command=lambda: xyzWindow(abc))
        xbut.pack()
    
        root.mainloop()
    
    main()
    

    En este código, creamos los botones de opción xb1, xb2 y xb3 fuera de la función xyzWindow y pasamos la variable IntVar abc como argumento al llamar a la función desde el comando del botón. De esta manera, los botones de opción no se vuelven a crear cada vez que se llama a la función y los valores se conservan. Ten en cuenta que también utilizamos Toplevel en lugar de Tk para crear una nueva ventana, de modo que la ventana principal no se actualice cada vez que se llame a xyzWindow.

    ¡Espero que esto te ayude! Hazme saber si tienes alguna otra pregunta.

Comments are closed.