我是编程新手,我正在尝试为幼儿创建数学测验。他们必须在60秒内回答尽可能多的问题。我有一个计时器和一个问题生成器
然而问题是,我不能让他们同时运行,例如,程序等待1秒,问一个问题,等到用户回答它,然后继续使用计时器等我希望计时器继续前进,而不是在问题得到解答时停止!这是我的计时器:
timer = 5
time.sleep(1)
timer -= 1
我的问题是通过定义变量(我已将其缩短为加法)生成的:
def questions():
first_number = random.randint(1, 50)
second_number = random.randint(1, 50)
print("What is", first_number, "+", second_number,"?")
answer = int(input("Answer: "))
if answer == first_number + second_number:
print("Correct!")
addition_score += 1
else:
print("Wrong!")
答案 0 :(得分:1)
打断input()
比应该更难。让我们首先关注一个更简单的任务:您想要反复调用questions()
,直到总耗用时间为60秒或更长。你可以通过用time.time()
测量时间来做到这一点,start_time = time.time() # "now" at the start
while time.time() < start_time + 60: # "not 60 seconds later"
questions()
返回一些秒,因为......一些随机的“时间零点”---无所谓。代码:
time.sleep()
诀窍不是使用input()
:在技术术语中,questions()
调用已经“阻塞”,并且您只能同时运行一个阻塞函数(除非您引入线程或多个过程,这在这里完全矫枉过正。)
如果答案正确,最后一个问题将计为+1,即使它在超过60秒后得到回答。可以通过让score += 1
返回True或False来更改此逻辑,并仅在返回True 时执行signal.alarm(60)
部分,如果还有剩余时间则返回。
如果你想在60秒后真正中断,那就稍微硬了一点。试试例如signal.signal(signal.SIGALRM, signal.default_int_handler)
(不在Windows上)。它会在给定的秒数后发出“闹钟”信号。默认情况下它会杀死进程;如果你想抓住它并做其他事情,请尝试另外做:try:
while True: # infinite loop, until interrupted
questions()
except KeyboardInterrupt:
pass # interrupted, now we're out of the loop
。它会在60秒后模拟一个Ctrl-C,你可以使用它来捕捉:
time.time()
(此版本中不再需要{{1}}。)
答案 1 :(得分:0)
从Process
库中试用multiprocessing
。请查看其他答案:https://stackoverflow.com/a/7207336/583834