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 actualizar TKinter Entry al hacer clic en un botón

Estoy tratando de pasar el nombre de archivo seleccionado de mi diálogo de archivo abierto a un widget Entry.
Todos los ejemplos que he visto simplemente hacen referencia al widget Entry dentro de la función ejecutada al hacer clic en el botón. Sin embargo, cuando hago eso, la aplicación se rompe con AttributeError: el objeto ‘NoneType’ no tiene el atributo ‘delete’.

Simplemente no entiendo por qué el objeto no se trata como un widget Entry.

import tkinter as tk
from tkinter import filedialog as fd
from tkinter import ttk

global init_csv
init_csv = ""

def select_csv_file(type_csv):
    filename = fd.askopenfilename(
            title="Seleccionar archivo csv",
            filetypes=[("archivos separados por comas","*.csv")]
            )
    match type_csv:
        case "init_csv":
            init_csv = filename
            err_csv.delete(0,END)

app_window = tk.Tk()
del_labelfrm = ttk.LabelFrame(app_window,text="Eliminar errores")
del_labelfrm.pack(fill="x",padx=4,pady=4)
ttk.Label(del_labelfrm,text="Archivo CSV de entrada: ").grid(column=0,row=0,padx=5,pady=5)
err_csv = ttk.Entry(del_labelfrm,textvariable=init_csv,width=50)
err_csv.grid(column=1, row=0, padx=5, pady=5)
csv_add = tk.PhotoImage(file="./img/add_csv.png")
err_csv_btn = ttk.Button(del_labelfrm,image=csv_add,command=lambda: select_csv_file("init_csv")).grid(column=2,row=0,pady=5)

app_window.pack_slaves()
app_window.mainloop()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema en el código parece estar en la línea err_csv = ttk.Entry(del_labelfrm,textvariable=init_csv,width=50).grid(column=1,row=0,padx=5,pady=5). Aquí, la variable err_csv está haciendo referencia al valor de retorno del método grid() en lugar del propio widget Entry. Por lo tanto, cuando se llama a err_csv.delete() más adelante, lanza el AttributeError porque err_csv es en realidad de tipo NoneType en ese punto.

    Para solucionar esto, puedes dividir la línea en dos, así:

    err_csv = ttk.Entry(del_labelfrm, textvariable=init_csv, width=50)
    err_csv.grid(column=1, row=0, padx=5, pady=5)
    

    De esta manera, err_csv hará referencia al widget Entry en sí mismo, y deberías poder llamar a err_csv.delete() sin ningún problema.

Comments are closed.