用于计时的Python计时器

时间:2014-09-15 21:29:28

标签: python timer while-loop

该程序询问用户问题,但只给他/她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)

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