Как связать Calendar.get_date () с StringVar () в tkinter - PullRequest
1 голос
/ 27 февраля 2020

Я работал над GUI для своего рода приложения "Rota manager", в котором в главном окне есть объект календаря, позволяющий пользователю выбрать конкретную c дату, а также начало и конец записи. его / ее рабочей смены. В главном окне я хотел бы иметь ярлык 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()

Это только часть кода с заданием, о котором я спрашиваю. Как обычно, большое спасибо всем, кто может помочь.

1 Ответ

2 голосов
/ 27 февраля 2020

Другое решение - использовать опцию календаря 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()
...