如何在禁用状态的Tkinter Entry组件中插入值并防止其被删除
搞定禁用状态Tkinter Entry插入值不丢内容的问题
嘿,我懂你想要的效果——给禁用的Entry插值,还得保证里面原来的内容不会被删掉对吧?看了你的代码片段,问题主要出在每次插入前都用delete(0, tk.END)清空了内容,另外咱们也得把禁用状态下的操作逻辑理清楚,下面给你两种解决方案:
方案一:插入时保留原有内容(不清空)
你的原代码每次触发func()都会先清空Entry再插新值,这自然会丢内容。如果想要保留原来的内容,直接去掉清空步骤,改成追加或者指定位置插入就行:
from tkinter import ttk import tkinter as tk blow = [("january", "2013")] def func(): for child in tree.get_children(): sum_val = tree.item(child, "values")[1] # 别用sum当变量名哦,这是Python内置函数 # 直接在末尾追加新值,加个空格区分多个内容 e1.insert(tk.END, sum_val + " ") root = tk.Tk() root.geometry("400x300") # 补全Treeview的创建和示例数据 tree = ttk.Treeview(root, columns=("month", "year"), show="headings") tree.heading("month", text="Month") tree.heading("year", text="Year") tree.insert("", tk.END, values=blow[0]) tree.pack(pady=20) # 创建禁用状态的Entry e1 = tk.Entry(root, state=tk.DISABLED) e1.pack(pady=10) # 加个按钮触发插入操作 btn = tk.Button(root, text="插入值", command=func) btn.pack() root.mainloop()
方案二:彻底锁死用户删除操作(程序仍可修改)
默认情况下,禁用状态的Entry用户根本没法编辑,自然删不了内容——程序还是能正常用insert/delete操作的,不用特意切换状态。要是你担心之后不小心把Entry改成正常状态,用户能删内容,可以绑定<Key>事件过滤掉删除、退格这些键:
def block_delete(event): # 阻止退格、删除等键的操作 if event.keysym in ('BackSpace', 'Delete'): return "break" # 给Entry绑定事件(即使之后改成NORMAL状态也生效) e1.bind("<Key>", block_delete)
几个小提醒
- 别用内置函数当变量名:比如你代码里的
sum,这是Python自带的求和函数,换成sum_val或者year_val更稳妥。 - 禁用Entry的程序操作:不用来回切
NORMAL和DISABLED状态,直接调用insert就能改内容,Tkinter允许这么干。 - 要是想替换内容而不是追加,那得先清空,但你要的是不删除,所以这步就跳过啦。
内容的提问来源于stack exchange,提问作者AD WAN
相关产品推荐
相关产品推荐

