You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于文本文件的Python倒计时日历程序出现语法错误求助

问题排查与修复方案

主要问题分析

  1. 日期差计算逻辑脆弱
    原代码把日期差转成字符串再拆分的方式完全没必要,date1 - date2会返回timedelta对象,直接调用其.days属性就能拿到整数天数,避免字符串拆分可能带来的格式错误。

  2. 所有事件文本重叠显示
    循环绘制文本时,y坐标固定写死为100,没有使用定义好的vertical_space变量,导致所有事件的文字都堆在同一个位置。

  3. 缺乏异常处理
    若文本文件中有空行或不符合事件名称,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:45:34