带计时器的考勤用户输入

0 投票
1 回答
51 浏览
提问于 2025-04-14 17:42

嗨,我刚开始学习Python,我想创建一个像考勤一样的程序。当输入收到“到场”时,它会把这个值加到一个列表里,但如果用户在一段时间内没有输入任何东西,就不会往列表里添加东西,然后程序会继续等待下一个输入。

这是我现在的进展。我不知道为什么计时器在条件满足后没有停止,以及为什么最后打印出来的总是有三个值。

from threading import Timer
print(f"Class Attendance")
Class = ["Student 1  ", "Student 2  ", "Student 3  "]
Attendance = []
for s in Class:
    timeout = 5
    t = Timer(timeout, print, [f'Absent'])
    t.start()
    q = str(input(s))
    if q == "present" or "present po":
        Attendance.append(s)
        t.cancel
print(f"Present Students: {Attendance}")

1 个回答

1

这可能不是你想要的答案,但要在有计时器的情况下实现 input() 函数是比较困难的,因为它是一个阻塞函数。这意味着在程序继续运行之前,必须先输入内容。不过,还有其他库提供了非阻塞的替代方案。

如果你使用的是Windows电脑,这个解决方案应该能达到你想要的效果。

首先,运行 pip install msvcrt

msvcrt库可以检测键盘输入。使用 msvcrt.getch() 可以返回一个字符,而且它是非阻塞的,所以下面的代码会按照你的想法工作。

import msvcrt
import time

if __name__ == "__main__":
    print("Class Attendance")
    students = ["Student 1", "Student 2", "Student 3"]
    attendance = []

    for stu in students:
        print(f"{stu}:", end=" ", flush=True)

        timeout = 5
        start_time = time.time()
        while time.time() - start_time < timeout: # timer
            if msvcrt.kbhit(): # non blocking
                if ord(msvcrt.getch()) == 112:  # p ascii value
                    attendance.append(stu)
                    print("present")
                    break
                else: # any other keystroke
                    print("absent")
                    break
        else: # if keyboard not hit
            print("absent")

    print(f"Present Students: {attendance}")

这段代码会检测是否按下了字符p(表示出席)。如果按下了p,那么学生就算是出席。如果按下了其他键(除了小写的p),或者在5秒内没有按任何键,就会算作缺席。希望这对你有帮助。

撰写回答