带计时器的考勤用户输入
嗨,我刚开始学习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秒内没有按任何键,就会算作缺席。希望这对你有帮助。