使用Tkinter日历控件计算两个日期间隔天数的问题求解
问题修复方案
你遇到的报错核心有两个原因:
- tkcalendar的Calendar控件默认返回两位年份的日期字符串,和你用的
%Y(匹配四位年份)格式规则不匹配 - 现有逻辑仅在程序启动时获取一次日期,用户后续在日历选择的新日期不会被读取,计算结果永远是启动时的固定差值
修复后的完整代码
import datetime from tkinter import * from tkcalendar import * root = Tk() root.title('Date') root.geometry("600x400") def calculate(): # 每次点击按钮时获取最新的日期 plum = datetime.datetime.today().strftime("%m/%d/%Y") pear = cal.get_date() date_format = "%m/%d/%Y" a = datetime.datetime.strptime(plum, date_format) b = datetime.datetime.strptime(pear, date_format) delta = b - a l1.config(text=f"间隔天数:{delta.days}") # 初始化日历时指定date_pattern,强制返回四位年份的日期格式 cal = Calendar(root, background="#99cbd8", disabledbackground="blue", bordercolor="#99cbd8", headersbackground="light blue", normalbackground="pink", foreground="blue", normalforeground='white', headersforeground='white', selectmode="day", year=2021, month=12, day=9, date_pattern="mm/dd/yyyy") cal.pack(pady=20) # 提前创建展示结果的Label,避免每次点击重复生成 l1 = Label(root, text="") l1.pack(pady=10) button = Button(root, text="calc", command=calculate) button.pack() root.mainloop()
关键修改说明
- 日期格式匹配问题:在Calendar初始化参数中加入
date_pattern="mm/dd/yyyy",强制控件返回四位年份的日期字符串,和你定义的%m/%d/%Y格式完全匹配。如果不想修改控件参数,也可以把解析格式改为"%m/%d/%y",%y原生支持两位年份的解析,会自动补全20前缀。 - 逻辑顺序调整:把日期获取、解析、计算的逻辑全部挪到
calculate函数内,保证每次点击按钮时读取的都是用户最新选择的日历日期和当前系统时间。 - 优化展示逻辑:提前创建结果展示用的Label,每次计算仅更新文本内容,避免点击一次按钮就新增一个Label的问题。
内容的提问来源于stack exchange,提问作者Minbutt
相关产品推荐
相关产品推荐

