该程序询问用户问题,但只给他/她10秒钟回答每个问题。如果他们在时间限制内回答问题,程序将转到下一个问题。此外,如果他们在时间限制内没有回答,程序将在10秒后跳到下一个问题。我知道计时器类,我如何集成它来做到这一点?这是我到目前为止的代码。不要担心pmXXXXX的东西,它是我用于学校项目的软件。
#question1
one = raw_input("Question 1:" + "\n" + qa + "\n" + "x" + "\n" + "A. Brightens it" + "\n" + "B. A gradient of black to white." + "\n" + "C. A color pallete.")
if(one.lower() == "b"):
print "Congrats! 10 points."
pmNewComputedImage("Question 1 Answer", 256, 256, "x")
score += 10
else:
print "Wrong. -10 points. Here's the answer."
window1 = pmNewComputedImage("Question 1 Answer", 256, 256, "x")
score -= 10
#question2
pmNewComputedImage("Question 2", 256, 256, "x*2")
two = raw_input("Question 2:" + "\n" + qb + "\n" + "A. x/2" + "\n" + "B. y/2" + "\n" + "C. x*2")
if (two.lower() == "c"):
print "Congrats! 10 points."
score += 10
else:
print "Wrong -10 points. The answer is C."
score -= 10
def stopwatch(seconds):
import time
start = time.time()
time.clock()
elapsed = 0
while elapsed < seconds:
elapsed = time.time() - start
print "Seconds count: %02d" % elapsed
time.sleep(1)
答案 0 :(得分:1)
raw_input
函数在用户输入内容之前不会返回,因此您无法直接执行此操作。
围绕它有多种方法。您可以在后台线程中运行定时器并使用信号来中断主线程;您可以使用signal.alarm
自动执行此操作,甚至不需要后台线程(但不能在Windows上);您可以将sys.stdin
置于非阻塞模式,并使用较低级别的I / O来代替raw_input
;你可以在子进程中进行输入,如果花费太长时间就终止它等等。
这是第一个版本的例子,它甚至可以在Windows上运行,但我不会保证它会在实践中使用:
import os
import signal
import threading
try:
mysig = signal.CTRL_C_EVENT
except NameError:
mysig = signal.SIGINT
def timed_raw_input(prompt, timeout):
t = threading.Timer(timeout, lambda: os.kill(os.getpid(), mysig))
try:
t.start()
result = raw_input(prompt)
except KeyboardInterrupt:
return '' # or whatever you want to do on timeout
else:
t.cancel()
return result
我不确定CTRL_C_EVENT
是否真的在Windows上引发KeyboardInterrupt
;您可能必须使用signal.signal
安装自己的处理程序。阅读链接的文档,并自己测试并查看。如果您必须安装信号处理程序,您也可以使用其他可用的跨平台信号而不是CTRL_C_EVENT
,并引发您自己的自定义异常,而不是KeyboardInterrupt
。