我目前正在使用 ttkbootstrap 库,而不是过去的 ttk 库。我曾经在“只读”状态下使用 ttk DateEntry 小部件,效果非常好。然而,由于某些原因,我需要停止使用 ttk 库,转而使用 ttkbootstrap 库。所以我创建了一个 ttkbootstrap DateEntry 就像文档中所述:https://ttkbootstrap.readthedocs.io/en/latest/styleguide/dateentry/
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 小部件在 ttk 库中工作得非常好。
我尝试搜索 DateEntry 类的源代码,但没有发现任何可以解释这种行为的内容。我仍然确信创建一个只读 DateEntry 并非不可能,因为它是这个库中您需要的最重要的东西之一。
您不应该编辑 ttkbootstrap 的代码。它会在下次更新时被覆盖。
您可以简单地创建一个继承自 的新类
DateEntry
,在 init 处定义条目的状态,并仅在按下按钮时启用该字段:编辑:
super()._on_date_ask()
按照@acw1668的建议,调用而不是编写新函数。只读状态使得日期只能读取而不能更改/编辑,因此它将其设置为当前日期,我认为这是不言自明的,我的问题是为什么不直接删除只读行,因为用户仍然可以通过日历弹出窗口选择日期吗?
好的,我刚刚进入 ttkbootstrap DateEntry 的源代码并复制该类以及 Querybox 类。为了避免这个问题,我解释说我发现了一件事,你必须将日期条目与全局文本变量链接起来。然后你可以
entry.insert(...)
用切换每个textvariable.set(...)
。您还必须转换textvariable.get(...)
复制的 Querybox 类中的所有插入内容。这里有 DateEntry 类:
和查询框类: