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

Python考勤计时程序问题:计时器未停止且全员被标记出勤

考勤程序问题修复方案

核心问题修复

你的代码存在两个直接导致异常的问题:

  1. 计时器未停止:t.cancel是方法调用,必须添加括号()才能执行,否则仅引用方法不会实际取消计时器。
  2. 出勤列表错误添加所有学生:if q == "present" or "present po"逻辑错误,"present po"是非空字符串,布尔判断中永远为True,导致无论输入什么都会执行添加操作。正确写法需明确判断输入是否等于两个指定值之一。

另外原代码的超时逻辑存在缺陷:input()是阻塞式调用,即使计时器触发打印"Absent",程序仍会卡在输入等待状态,无法自动进入下一位学生考勤。以下是修复并优化后的完整代码:

修复后代码

from threading import Timer, Event
import sys

print("Class Attendance")
Class = ["Student 1", "Student 2", "Student 3"]
Attendance = []

def timeout_handler(event, student):
    print(f"\n{student}: Absent")
    event.set()  # 标记超时事件

for s in Class:
    timeout = 5
    event = Event()
    # 初始化计时器,超时后执行处理函数
    t = Timer(timeout, timeout_handler, args=(event, s))
    t.start()
    
    print(f"\n请输入{s}的考勤状态(输入'present'或'present po'标记出勤,{timeout}秒未输入视为缺勤):")
    try:
        # 使用select监听输入,实现超时自动跳过
        import select
        ready, _, _ = select.select([sys.stdin], [], [], timeout)
        if ready:
            q = sys.stdin.readline().strip()
            if q in ["present", "present po"]:
                Attendance.append(s)
                print(f"{s}: Present")
            else:
                print(f"{s}: 无效输入,视为缺勤")
            t.cancel()  # 输入完成,取消计时器
        else:
            # 超时,无需额外操作,计时器已处理
            pass
    except Exception as e:
        print(f"出错:{e}")
        t.cancel()

print(f"\nPresent Students: {Attendance}")

优化说明

  • 修正计时器调用:确保通过t.cancel()终止未触发的计时器
  • 修复条件判断:用q in ["present", "present po"]精准匹配有效输入
  • 完善超时逻辑:通过select.select监听输入,超时后自动跳过当前学生,解决原代码中input()阻塞的问题(跨平台兼容,Windows下若遇问题可替换为msvcrt模块实现)

内容的提问来源于stack exchange,提问作者AHRON MARTINEZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:42:23