如何在单击按钮时更新 TKinter 条目

How to update TKinter Entry on button click

我正在尝试将我打开的文件对话框的选定文件名移交给一个条目小部件。 我查看的所有示例都仅引用按钮单击时执行的函数中的 Entry-widget。但是,当我这样做时,应用程序在 AttributeError: 'NoneType' object has no attribute 'delete'.

中断

我只是不明白为什么该对象不被视为 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="Select csv file",
            filetypes=[("comma separated files","*.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=" Thin-out errors ")
del_labelfrm.pack(fill="x",padx=4,pady=4)
ttk.Label(del_labelfrm,text="Input CSV file: ").grid(column=0,row=0,padx=5,pady=5)
err_csv = ttk.Entry(del_labelfrm,textvariable=init_csv,width=50).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()

离你不远了。使您的代码正常工作的几件事:

  • 出于某种原因,如果您以后想要正确访问该项目,则需要拆分小部件定义和布局中的位置:
err_csv = ttk.Entry(del_labelfrm,textvariable=init_csv,width=50)
err_csv.grid(column=1, row=0, padx=5, pady=5)
  • 您还需要将文件名的文本插入小部件,在 select_csv_file 函数内
        err_csv.delete(0, END)
        err_csv.insert(0, filename)
  • 最后,您需要导入 END 语句才能使用它
from tkinter import END

完整的工作示例(只是我用一个简单的 if 替换了你的案例,我需要 python 3.10 才能工作吗?我很好奇..):

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

global init_csv
init_csv = ""

def select_csv_file(type_csv):
    filename = fd.askopenfilename(
            title="Select csv file",
            filetypes=[("comma separated files","*.csv")]
            )
    if type_csv == "init_csv":
        init_csv = filename
        err_csv.delete(0,END)
        err_csv.insert(0, filename)

app_window = tk.Tk()
del_labelfrm = ttk.LabelFrame(app_window,text=" Thin-out errors ")
del_labelfrm.pack(fill="x",padx=4,pady=4)
ttk.Label(del_labelfrm,text="Input CSV file: ").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()