我在 python 脚本中使用 ttkbootstrap 。我尝试使用 ttkbootstrap 中的 DateEntry,但它不会像 tkcalendar 那样触发事件(至少我找不到任何东西),而且我喜欢 tkcalendar 侧面有一个星期计数器。
所以我会喜欢使用 tkcalendar DateEntry 而不是 ttkbootstrap DateEntry。现在,它本身可以完美工作,但当我一起使用 ttkbootstrap 和 tkcalendar 时,我总是得到
AttributeError: 'DateEntry' object has no attribute '_calendar'
这是我的代码,不起作用:
import ttkbootstrap as ttk
from tkcalendar import DateEntry
#setup the window
pwin = ttk.Window(themename="cyborg")
pwin.title('test')
#function to get the date
def seedate():
print(cal.get_date())
#this is he DateEntry widget
cal = DateEntry(pwin,bootstyle="info")
cal.place(x=10, y=80)
#button to get the selected date
btnpt = ttk.Button(pwin, text="Save Schedule", bootstyle="light-outline", command=seedate)
btnpt.place(x=10, y=140)
pwin.mainloop()
When我使用 ttkbootstrap DateEntry 代替,它立即起作用。
我尝试更新这两个模块,但它不起作用。并切换到 ttkbootstram DateEntry,然后就可以了。
你遇到的问题在于,
tkcalendar.DateEntry
与
ttkbootstrap
的样式不兼容。
ttkbootstrap
主要为 Tkinter 的主题小部件 (ttk) 设计,而不是像
tkcalendar.DateEntry
这样的纯 Tkinter 小部件。
当你尝试使用
bootstyle
参数来设置
tkcalendar.DateEntry
的样式时,
ttkbootstrap
会试图修改它,但由于
tkcalendar.DateEntry
没有
_calendar
属性(这是
ttkbootstrap
预期 ttk 小部件具有的属性),所以导致了错误。
解决这个问题的方法有几种:
1. 不使用 ttkbootstrap 样式:
最简单的解决方法是不要在
tkcalendar.DateEntry
上使用
bootstyle
参数。这将保持
tkcalendar.DateEntry
的默认外观,但不会与 ttkbootstrap 主题发生冲突。
cal = DateEntry(pwin)
2. 使用 ttkcalendar (如果可用):
如果
tkcalendar
提供了基于 ttk 的
DateEntry
版本 (例如
ttkcalendar
),你可以尝试使用它。 这将允许
ttkbootstrap
正确应用样式。
3. 创建自定义 ttkbootstrap 样式:
你可以创建自定义
ttkbootstrap
样式来专门针对
tkcalendar.DateEntry
。但这需要对
ttkbootstrap
的样式机制有深入了解,并且可能比较复杂。
4. 使用其他日期选择器小部件:
你可以考虑使用其他与
ttkbootstrap
兼容的日期选择器小部件,例如:
-
tkinter.ttk.Spinbox:
你可以使用三个
Spinbox
小部件来分别选择年、月和日。 -
第三方库:
有一些第三方库提供了与
ttkbootstrap
兼容的日期选择器小部件,例如tkinterdnd2
。
选择哪种方法取决于你的具体需求和技术水平。
标签:python,tkinter,ttk,tkcalendar,ttkbootstrap From: 78780436