1

我一直在为一种“Rota manager”应用程序开发 GUI,该应用程序在主窗口中有一个日历对象,以允许用户在其上选择特定日期并记录他/她的工作班次的开始和结束。在主窗口中,我希望有一个 tk.Label 显示在日历上选择的日期,并且每次用户点击不同的日期时都会更改。我发现了很多与类似问题相关的问题,但我不知道如何在点击后让标签自行更新。到目前为止,我只能显示日期的第一个选择(默认为今天的日期)。这里是代码的一部分:

    import tkinter as tk
    from tkinter import StringVar
    from tkcalendar import Calendar

    class MainWindow:
        def __init__(self, master):
            self.master = master
            master.title("Rota Manager")
            master.geometry("400x550")
            master.grid_rowconfigure(0, weight=1)
            master.grid_columnconfigure(0, weight=1)
            master.resizable(False, False)
            self.cal = Calendar(self.master, font="Arial 14", selectmode='day', date_pattern='dd/mm/yy')
            self.cal.grid(sticky='nsew', pady=10, padx=5)
            self.v = StringVar()
            self.dynamic_label = tk.Label(self.master, textvariable=self.v, font=('Arial', 10))
            self.dynamic_label.grid(row=5, sticky='n')
            self.v.set(f"Date selected: {self.cal.get_date()}")

    if __name__ == "__main__":
        root = tk.Tk()
        app = MainWindow(root)
        root.mainloop()

这只是我要询问的任务的代码部分。像往常一样,非常感谢任何可以提供帮助的人。

4

1 回答 1

2

另一种解决方案是使用日历的textvariable选项来跟踪选定的日期。所以只需将标签和日历连接到同一个StringVar.

import tkinter as tk
from tkinter import StringVar
from tkcalendar import Calendar

class MainWindow:
    def __init__(self, master):
        self.master = master
        master.title("Rota Manager")
        master.geometry("400x550")
        master.grid_rowconfigure(0, weight=1)
        master.grid_columnconfigure(0, weight=1)
        master.resizable(False, False)
        self.v = StringVar(self.master, Calendar.date.today().strftime("%d/%m/%y"))
        self.cal = Calendar(self.master, font="Arial 14", selectmode='day', 
                            date_pattern='dd/mm/yy', textvariable=self.v)
        self.cal.grid(sticky='nsew', pady=10, padx=5)

        label_frame = tk.Frame(self.master) # put static label and dynamic label in single frame
        tk.Label(label_frame, text="Date selected: ", 
                 font=('Arial', 10)).pack(side="left")  # static_label
        self.dynamic_label = tk.Label(label_frame, 
                                      textvariable=self.v, font=('Arial', 10))
        self.dynamic_label.pack(side="left")
        label_frame.grid(row=5, sticky='n')


if __name__ == "__main__":
    root = tk.Tk()
    app = MainWindow(root)
    root.mainloop()
于 2020-02-27T15:20:39.020 回答