tkinter tkcalendar 显示事件
tkinter tkcalendar to display events
我正在尝试使用 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()
到目前为止一切正常。问题是事件数据库非常大并且会扩展数年。理想情况下,我只想创建正在显示的月份的事件。我需要检测用户何时单击 "Next month" 和 "Previous Month"(tkcalendar 附带的标准按钮):
并为显示的月份创建事件。这可能吗?
非常感谢你
您可以创建一个 class 继承自 Calendar
并重新定义 "Next month" 和 "Previous Month" 按钮的回调,以便它们生成虚拟事件 '<<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()
我正在尝试使用 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()
到目前为止一切正常。问题是事件数据库非常大并且会扩展数年。理想情况下,我只想创建正在显示的月份的事件。我需要检测用户何时单击 "Next month" 和 "Previous Month"(tkcalendar 附带的标准按钮):
并为显示的月份创建事件。这可能吗?
非常感谢你
您可以创建一个 class 继承自 Calendar
并重新定义 "Next month" 和 "Previous Month" 按钮的回调,以便它们生成虚拟事件 '<<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()