tkinter tkcalendar для отображения событий - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь использовать 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): enter image description here

и создавать события длямесяц отображается.Это вообще возможно?

Заранее большое спасибо

1 Ответ

0 голосов
/ 26 сентября 2018

Вы можете создать класс, унаследованный от 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...