You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:32:39