提问人:fibonacci 提问时间:11/15/2023 更新时间:11/15/2023 访问量:65
如何使用 ttkbootstrap 绑定。DateEntry 使用所选日期更新标签?
How do I use binding with ttkbootstrap.DateEntry to update a Label with the selected date?
问:
我使用 ttkbootstrap 框架主要是因为现代 ,它有一些有用的主题。我的目标是让一个小部件自动更新从 DatePickerPopup 中选择的日期,但事件使用不像常规 tkinter 那样工作。我的解决方法是使用 a 在单击时调用我的 update_label 函数。每次用户选择日期时生成的虚拟事件是什么?DateEntry
DateEntry
Label
"<<DateEntrySelected>>"
.bind()
Button
这是我的代码片段:
import ttkbootstrap as ttk
from datetime import datetime
def update_label(event):
selected_date = cal.entry.get()
date_object = datetime.strptime(selected_date, "%m/%d/%Y")
formated_date = date_object.strftime("%A, %b %d")
label.config(text=f"{formated_date}")
root = ttk.Window()
root.geometry("600x400")
# Label
label = ttk.Label(root, text="Today")
label.pack(pady=5)
# DateEntry
cal = ttk.DateEntry(root, bootstyle="primary")
cal.pack(pady=5)
cal.bind("<<DateEntrySelected>>", update_label) # FIX
root.mainloop()
ttkbootstrap 文档:https://ttkbootstrap.readthedocs.io/en/latest/api/widgets/dateentry/
在那里,它说......“日期输入小部件将 Combobox 和 Button 与附加到 get_date 函数的回调组合在一起。 按下时,会显示日期选择器弹出窗口。返回的值将插入到组合框中。 日期选择器弹出窗口将使用组合框中的日期作为焦点日期..."
解决方法是使用按钮,如下所示......
btn = ttk.Button(root, text="Update", command=update_label)
btn.pack(pady=5)
答:
0赞
toyota Supra
11/15/2023
#1
我的解决方法是使用 Button 调用我的 update_label 函数 点击。
问题可以解决。
删除函数中的参数。update_label
注释掉第 7 行和第 8 行。
添加按钮小部件。
片段:
def update_label():
selected_date = cal.entry.get()
#date_object = datetime.strptime(selected_date, "%m/%d/%Y")
#formated_date = date_object.strftime("%A, %b %d")
label.config(text=f"{selected_date}")
...
...
...
btn = ttk.Button(root, text="Update", command=update_label)
btn.pack(pady=5)
截图:
0赞
Andrej Kesely
11/15/2023
#2
您可以使用它并将其绑定到:StringVar
calendar.entry
from datetime import datetime
from tkinter import StringVar
import ttkbootstrap as ttk
def update_label(sv):
selected_date = sv.get()
if selected_date == "":
return
date_object = datetime.strptime(selected_date, "%m/%d/%Y")
formated_date = date_object.strftime("%A, %b %d")
label.config(text=f"{formated_date}")
root = ttk.Window()
root.geometry("600x400")
# Label
label = ttk.Label(root, text="Today")
label.pack(pady=5)
# DateEntry
cal = ttk.DateEntry(root, bootstyle="primary")
cal.pack(pady=5)
sv = StringVar()
sv.trace("w", lambda name, index, mode, sv=sv: update_label(sv))
cal.entry.configure(textvariable=sv)
root.mainloop()
创建此应用:
0赞
acw1668
11/15/2023
#3
ttkbootstrap.DateEntry
不生成虚拟事件。但是,您可以创建一个自定义类来模拟该功能:<<DateEntrySelected>>
DateEntry
...
class MyDateEntry(ttk.DateEntry):
# override function
def _on_date_ask(self):
super()._on_date_ask()
# generate the virtual event
self.event_generate("<<DateEntrySelected>>")
# function to return the selected date
def get_date(self):
return datetime.strptime(self.entry.get(), self._dateformat)
def update_label(event):
date_object = event.widget.get_date()
formated_date = date_object.strftime("%A, %b %d")
label.config(text=f"{formated_date}")
...
# use the custom DateEntry
cal = MyDateEntry(root, bootstyle="primary")
...
评论