10秒后如何强制某些用户输入

时间:2018-09-17 13:03:01

标签: python python-3.x timer

我是python入门者,需要一些游戏测验方面的帮助。 这是我的代码:

import time
from threading import Timer
import random as rnd

q = ["q1", "q2", "q3"]
a = ["a1    b1    c1", "a2    b2    c2", "a3    b3    c3"]
ca = ["b", "c", "b"]
points = 0


rand_q = rnd.randint(0, len(q) - 1)                                             # Choosing random question
print(q[rand_q] + "\n" + a[rand_q] + "\n")                                      # Asking question and showing answers
time.sleep(0.5)                                                                 # Little pause between prompts

t = Timer(10, print, ['Time is up!'])                                           # Setting up timer
t.start()                                                                       # Start timer
start = time.time()                                                             # Start of time check
answer = input("You have 10 seconds to choose the correct answer.\n")           # User input
if answer is ca[rand_q]:                                                        # Check if answer is correct
    print("Correct answer!")
    points = (points + round(10 - time.time() + start, 1)) * 10                 # Calculate points
else:
    print("Wrong answer!")
t.cancel()                                                                      # Stop timer
print("Points:", points)
input("Press ENTER to quit")

del q[rand_q]                                                                   # Removing the question
del a[rand_q]                                                                   # Removing the answer
del ca[rand_q]                                                                  # Removing the correct answer

运行此程序时,我可以回答问题并获得积分,但是每当我等待计时器时,都会提示我时间已到,但我仍然可以填写并回答问题。

我希望输入在10秒钟后停止工作,但是我似乎无法使它工作。有什么办法可以使计时器在“时间到了”提示上方的所有先前输入超时。

我已经看到了更多类似的帖子,但是它们似乎已经过时了,我没有让它们工作。

编辑:sleep命令不起作用。它会显示一行,说为时已晚,但是您仍然可以在此之后输入答案。线程计时器相同。我想在10秒后终止输入命令,但Windows似乎没有解决办法。

1 个答案:

答案 0 :(得分:0)

问题在于python的输入功能正在阻塞,这意味着直到用户输入一些数据后,下一行代码才会执行​​。非阻塞输入是很多人一直在要求的东西,但是最好的解决方案是让您创建一个单独的线程并在那里询问问题。这个问题已经在this帖子

中得到了回答

此解决方案将起作用,除了用户仍然需要在某些时候按Enter才能进行:

import time
import threading

fail = False
def time_expired():
    print("Too slow!")
    fail = True

time = threading.Timer(10, time_expired)
time.start()
prompt = input("You have 10 seconds to choose the correct answer.\n")

if prompt != None and not fail:
    print("You answered the question in time!")
    time.cancel()

您可以按照自己的意愿去做,但这变得非常复杂。