【问题标题】:tkinter tkcalendar to display eventstkinter tkcalendar 显示事件
【发布时间】:2018-09-26 10:03:15
【问题描述】:

我正在尝试使用 tkcalendar 在我的 python tkinter 应用程序中显示一些事件。我有一个事件数据库,并将它们放在日历中,如下例所示(我创建了一个事件字典来显示案例)。在这个例子中,我遍历所有事件并将它们全部放在日历中

import tkinter as tk
import tkinter.ttk as ttk
from tkinter import *
import tkcalendar
from tkcalendar import Calendar, DateEntry
import datetime

root = tk.Tk()

events={'2018-09-28':('London','meeting'),\
    '2018-08-15':('Paris','meeting'),\
    '2018-07-30':('New York','meeting')}

cal = Calendar(root, selectmode='day', year=2018, month=8)

for k in events.keys():
    date=datetime.datetime.strptime(k,"%Y-%m-%d").date()
    cal.calevent_create(date, events[k][0], events[k][1])

cal.tag_config('meeting', background='red', foreground='yellow')
cal.pack(fill="both", expand=True)

root.mainloop()

到目前为止一切正常。问题是事件数据库非常大,并且会扩展数年。理想情况下,我只想创建正在显示的月份的事件。我需要检测用户何时单击“下个月”和“上个月”(tkcalendar 附带的标准按钮):

并为正在显示的月份创建事件。这可能吗?

非常感谢您

【问题讨论】:

  • 你已经告诉我们你想要做什么,但没有问任何问题(除了“这可能吗?”)。你需要什么样的帮助?你有什么尝试解决这个问题?也许您应该从仅两到三个月的事件开始,直到您弄清楚如何仅显示显示的月份的事件。

标签: python tkinter tkcalendar


【解决方案1】:

您可以创建一个继承自Calendar 的类并重新定义“下个月”和“上个月”按钮的回调,以便它们生成虚拟事件'<<CalendarMonthChanged>>'。然后将此事件绑定到显示当前月份事件的函数。

代码如下:

from tkcalendar import Calendar
from tkinter import Tk


class MyCalendar(Calendar):

    def _next_month(self):
        Calendar._next_month(self)
        self.event_generate('<<CalendarMonthChanged>>')

    def _prev_month(self):
        Calendar._prev_month(self)
        self.event_generate('<<CalendarMonthChanged>>')

    def _next_year(self):
        Calendar._next_year(self)
        self.event_generate('<<CalendarMonthChanged>>')

    def _prev_year(self):
        Calendar._prev_year(self)
        self.event_generate('<<CalendarMonthChanged>>')

    def get_displayed_month_year(self):
        return self._date.month, self._date.year


def on_change_month(event):
    # remove previously displayed events
    cal.calevent_remove('all')
    year, month = cal.get_displayed_month_year()
    # display the current month events 
    # ...
    print(year, month)

root = Tk()
cal = MyCalendar(root)
cal.pack()

cal.bind('<<CalendarMonthChanged>>', on_change_month)

root.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 2015-07-04
    • 2021-08-12
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多