python - 无法加载具有相应日期的日历
问题描述
from tkinter import *
from tkcalendar import Calendar
def get_date():
label.configure(text=str(today.get_displayed_month()))
today.configure(day=str(today.get_date()))
win = Tk()
win.title('Calendar Picker')
label = Label(win,text='August 2020')
label.pack(pady=10)
btn = Button(win,text='Pick a date',command=get_date)
btn.pack(pady=10)
today = Calendar(win,selectmode='day',year=2020,month=8,day=6)
today.pack(pady=10)
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python38\lib\tkinter\__init__.py", line 1883, in __call__
return self.func(*args)
File "E:\Python\Python Projects Fun\calproject.py", line 6, in get_date
today.configure(day=str(today.get_date()))
File "C:\Python38\lib\site-packages\tkcalendar\calendar_.py", line 1612, in configure
self[item] = value
File "C:\Python38\lib\site-packages\tkcalendar\calendar_.py", line 518, in __setitem__
raise AttributeError("Calendar object has no attribute %s." % key)
AttributeError: Calendar object has no attribute day.
抱歉,当我按下“选择日期”按钮时,出现了上述错误。请问如果我想在移动月份时在窗口顶部显示相应的日期,我应该使用什么?因为我不清楚文档所以有人可以教我这个方法吗?解决上述错误的最佳方法是什么?
解决方案
该错误是因为day
选项仅在您创建Calendar
实例时可用。configure()
它在功能中不可用。
如果要更新label
月份更改时,可以绑定<<CalendarMonthChanged>>
事件并更新label
事件回调内部:
def on_month_changed(event):
month, year = today.get_displayed_month()
label.configure(text=today._month_names[month]+' '+str(year))
...
today = Calendar(win, selectmode='day', year=2020, month=8, day=6)
today.pack(pady=10)
today.bind('<<CalendarMonthChanged>>', on_month_changed)
更新:如果要在更改月份后选择同一天,请修改以下get_date()
功能:
import calendar
...
def get_date():
month, year = today.get_displayed_month()
# get the last day of selected month
_, lastday = calendar.monthrange(year, month)
# make sure day is valid day in selected month
day = min(today._sel_date.day, lastday)
# select the day in selected month
today.selection_set(today.date(year, month, day))
更新 2:以下是通过以下方式选择日期时更新日历的示例tkcalendar.DateEntry
:
from tkinter import *
from tkcalendar import Calendar, DateEntry
def date_selected(event):
date = date_entry.get_date()
cal.selection_set(date)
win = Tk()
win.title('Calendar Picker')
date_entry = DateEntry(win, date_pattern='y-mm-dd', state='readonly')
date_entry.pack()
date_entry.bind('<<DateEntrySelected>>', date_selected)
cal = Calendar(win, selectmode='day', date_pattern='y-mm-dd')
cal.pack(pady=10)
win.mainloop()
推荐阅读
- database - 操作系统与数据库管理系统
- android - 通知永远不会在模拟器中显示
- jquery - 检测包含特定 div 的部分何时更改类?
- c - c如何计算余数?
- python - Django ORM:过滤 timedelta
- linux - 如何使用 Python(独立于操作系统)获取 pid 列表和有关 PID 的信息?
- python-3.x - 如何修复:ERR 协议错误:预期为“$”,得到“”
- c# - 如何从 C# 动态编译 C/C++ 文件
- python-3.x - ModuleNotFoundError:没有带有屏幕截图实用程序的名为“fcntl”的模块
- python - 合并两个大数据框