ttkbootstrap DateEntry设为readonly状态后无法选择修改日期
问题解决:ttkbootstrap DateEntry设为readonly后日期不更新
问题重现
使用ttkbootstrap的DateEntry组件时,设置state="readonly"后,虽能禁止键盘输入,但选择新日期后组件内容始终固定为当日日期,无法同步更新。复现代码如下:
import ttkbootstrap as tb from ttkbootstrap import constants root = tb.Window() date_entry = tb.DateEntry(root) date_entry.pack(padx = 10, pady = 10) date_entry["state"] = "readonly" root.mainloop()
原因分析
ttkbootstrap的DateEntry在readonly状态下,内部输入框的只读属性会阻断日期选择后的内容更新逻辑,导致选中的新日期无法同步到显示区域。
解决方案
方案一:阻止键盘输入替代readonly
不直接设置组件为readonly,而是通过绑定键盘事件阻止输入,同时保持组件状态为normal,既实现禁止键盘输入的效果,又不影响日期选择后的内容更新:
import ttkbootstrap as tb root = tb.Window() date_entry = tb.DateEntry(root) date_entry.pack(padx=10, pady=10) # 拦截所有键盘输入事件 def block_key_input(event): return "break" date_entry.bind("<Key>", block_key_input) root.mainloop()
方案二:手动触发日期更新
如果必须设置readonly状态,可通过绑定日期选择事件,手动更新输入框内容:
import ttkbootstrap as tb root = tb.Window() date_entry = tb.DateEntry(root) date_entry.pack(padx=10, pady=10) date_entry["state"] = "readonly" # 选择日期后手动同步内容到输入框 def update_date_display(event): selected_date = date_entry.entry.get() # 临时解除只读状态更新内容 date_entry.entry.config(state="normal") date_entry.entry.delete(0, "end") date_entry.entry.insert(0, selected_date) date_entry.entry.config(state="readonly") date_entry.bind("<<DateEntrySelected>>", update_date_display) root.mainloop()
两种方案均能实现「禁止键盘输入+正常选择更新日期」的需求,方案一更简洁高效,推荐优先使用。
内容的提问来源于stack exchange,提问作者d'Elbreil Clément
相关产品推荐
相关产品推荐

