如何在PySimpleGUI日历组件中添加并显示事件?
在PySimpleGUI日历中显示事件的实现思路
1. 先搞定事件数据的存储
用一个字典关联日期和事件,key统一用%Y-%m-%d格式的字符串,value是该日期对应的事件列表,示例:
events = { "2024-05-20": ["约会", "买礼物"], "2024-05-21": ["提交项目报告"] }
这种结构方便快速查找某一天的事件,添加新事件时也能直接更新字典。
2. 自定义日历单元格渲染(核心)
PySimpleGUI的Calendar组件是封装了tkcalendar库的控件,你可以通过window['-CALENDAR-'].Widget拿到底层的tkcalendar对象,然后修改它的单元格显示逻辑:
- 继承
tkcalendar.Calendar类,重写_day_cell方法,绘制日期后把事件缩写、小圆点这类标记加到单元格里 - 或者直接给现有日历对象绑定
<<CalendarMonthChanged>>事件,切换月份时给有事件的日期加背景色、小图标高亮
简单的高亮示例:
import tkcalendar import PySimpleGUI as sg from datetime import datetime events = {"2024-05-20": ["约会", "买礼物"]} # 创建窗口 layout = [[sg.Calendar(key='-CALENDAR-', format='%Y-%m-%d')]] window = sg.Window('带事件的日历', layout) cal = window['-CALENDAR-'].Widget # 给有事件的日期加背景色 def highlight_dates(event): # 清除旧高亮 for date in cal.calevent_dates: cal.calevent_remove(date) # 添加新高亮 for date_str in events.keys(): date = datetime.strptime(date_str, "%Y-%m-%d").date() cal.calevent_create(date, '', 'event_tag') cal.tag_config('event_tag', background='lightblue') cal.bind('<<CalendarMonthChanged>>', highlight_dates) highlight_dates(None) # 初始化时就高亮
3. 绑定日期点击显示事件详情
给日历绑定点击事件,用户点选日期时直接展示当天的所有事件:
- 窗口布局里加一个Multiline或Listbox组件用来显示事件
- 给日历绑定
<Button-1>事件,回调中获取选中日期,从字典里取出对应事件更新显示
示例:
# 更新布局 layout = [ [sg.Calendar(key='-CALENDAR-', format='%Y-%m-%d')], [sg.Text('当日事件:'), sg.Multiline(size=(40,8), key='-EVENT_BOX-', disabled=True)] ] window = sg.Window('带事件的日历', layout) cal = window['-CALENDAR-'].Widget def show_day_events(event): selected_date = cal.get_date() day_events = events.get(selected_date, ['无事件']) window['-EVENT_BOX-'].update('\n'.join(day_events)) cal.bind('<Button-1>', show_day_events)
4. 添加事件后实时更新
在添加事件的窗口保存事件后,同步更新全局的events字典,然后调用高亮函数刷新日历显示,同时更新当前选中日期的事件列表,确保界面和数据一致。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

