基于文本文件的Python倒计时日历程序出现语法错误求助
问题排查与修复方案
主要问题分析
日期差计算逻辑脆弱
原代码把日期差转成字符串再拆分的方式完全没必要,date1 - date2会返回timedelta对象,直接调用其.days属性就能拿到整数天数,避免字符串拆分可能带来的格式错误。所有事件文本重叠显示
循环绘制文本时,y坐标固定写死为100,没有使用定义好的vertical_space变量,导致所有事件的文字都堆在同一个位置。缺乏异常处理
若文本文件中有空行或不符合事件名称,DD/MM/YY格式的行,会直接触发IndexError或ValueError,需要增加基础的校验逻辑。
修正后的代码
from tkinter import Tk, Canvas from datetime import date, datetime def get_events(): list_events = [] with open('events.txt', encoding='utf-8') as file: for line_num, line in enumerate(file, 1): line = line.strip() # 跳过空行 if not line: continue current_event = line.split(',') # 校验行格式是否正确 if len(current_event) != 2: print(f"第{line_num}行格式错误,跳过该行:{line}") continue try: event_date = datetime.strptime(current_event[1].strip(), '%d/%m/%y').date() current_event[1] = event_date list_events.append(current_event) except ValueError as e: print(f"第{line_num}行日期格式错误,跳过该行:{line},错误信息:{e}") return list_events def days_between_dates(date1, date2): # 直接返回整数天数,正数为未来,负数为已过去 return (date1 - date2).days root = Tk() c = Canvas(root, width=800, height=800, bg='black') c.pack() c.create_text(100, 50, anchor='w', fill='orange', font='ComicsansMS 32 bold underline', text='My countdown calendar') events = get_events() today = date.today() vertical_space = 100 for event in events: event_name = event[0].strip() days_until = days_between_dates(event[1], today) # 根据天数正负调整显示文本 if days_until > 0: display = f"还有 {days_until} 天到 {event_name}" elif days_until == 0: display = f"今天就是 {event_name}!" else: display = f"{event_name} 已经过去 {-days_until} 天了" # 使用vertical_space作为y坐标,实现换行 c.create_text(100, vertical_space, anchor='w', fill='lightblue', font='Arial 28 bold', text=display) vertical_space += 30 root.mainloop()
关键修改说明
- 日期差计算改为直接获取
timedelta.days,逻辑简洁且可靠 - 绘制文本时使用
vertical_space作为y坐标,每次循环后递增,实现事件文本逐行显示 - 增加空行跳过、格式校验和日期解析异常捕获,避免程序因文本文件格式问题直接崩溃
- 优化显示文本,根据天数正负给出不同的提示信息
- 读取文件时指定编码为
utf-8,避免中文等非ASCII字符读取错误 - 增加
.strip()处理,去除文本中的多余空格
内容的提问来源于stack exchange,提问作者Ivan Fedorenko
相关产品推荐
相关产品推荐

