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()
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 variableerr_csv
está haciendo referencia al valor de retorno del métodogrid()
en lugar del propio widgetEntry
. Por lo tanto, cuando se llama aerr_csv.delete()
más adelante, lanza elAttributeError
porqueerr_csv
es en realidad de tipoNoneType
en ese punto.Para solucionar esto, puedes dividir la línea en dos, así:
De esta manera,
err_csv
hará referencia al widgetEntry
en sí mismo, y deberías poder llamar aerr_csv.delete()
sin ningún problema.