如何使用 ttkbootstrap 绑定。DateEntry 使用所选日期更新标签?

How do I use binding with ttkbootstrap.DateEntry to update a Label with the selected date?

提问人:fibonacci 提问时间:11/15/2023 更新时间:11/15/2023 访问量:65

问:

我使用 ttkbootstrap 框架主要是因为现代 ,它有一些有用的主题。我的目标是让一个小部件自动更新从 DatePickerPopup 中选择的日期,但事件使用不像常规 tkinter 那样工作。我的解决方法是使用 a 在单击时调用我的 update_label 函数。每次用户选择日期时生成的虚拟事件是什么?DateEntryDateEntryLabel"<<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)
python tkinter 绑定 ttkbootstrap

评论


答:

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)

截图:

enter image description here

0赞 Andrej Kesely 11/15/2023 #2

您可以使用它并将其绑定到:StringVarcalendar.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()

创建此应用:

enter image description here

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")
...