python 如何使用ttkbootstrap.DateEntry绑定来用所选日期更新Label?

ymdaylpp  于 2023-11-15  发布在  Python
关注(0)|答案(3)|浏览(248)

我使用ttkbootstrap框架主要是因为现代的DateEntry,它有一些有用的主题。我的目标是让DateEntry小部件自动更新Label,使用从DatePickerPopup中选择的日期,但是使用.bind()"<<DateEntrySelected>>"事件不像使用常规tkinter那样工作。我的解决方法是使用Button来调用我的update_label函数-单击。用户每次选择日期时生成的虚拟事件是什么?
下面是我的代码片段:

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/
在那里,它说.“* 一个日期输入小部件将组合框和一个按钮结合在一起,并在get_date函数上附加一个回调。按下时,会显示一个日期查询器弹出窗口。返回的值会插入到组合框中。日期查询器弹出窗口将使用组合框中的日期作为关注日期. *”
解决方法是使用一个按钮,像这样.

btn = ttk.Button(root, text="Update", command=update_label)
btn.pack(pady=5)

v64noz0r

v64noz0r1#

您可以使用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()

字符串
创建此应用程序:


的数据

yyyllmsg

yyyllmsg2#

我的解决方法是使用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)

字符串
截图:


的数据

mwkjh3gx

mwkjh3gx3#

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

字符串

相关问题