Python考勤计时程序问题:计时器未停止且全员被标记出勤
考勤程序问题修复方案
核心问题修复
你的代码存在两个直接导致异常的问题:
- 计时器未停止:
t.cancel是方法调用,必须添加括号()才能执行,否则仅引用方法不会实际取消计时器。 - 出勤列表错误添加所有学生:
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
相关产品推荐
相关产品推荐

