Python计时计时器

2024-03-29 02:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

这个程序会询问用户问题,但只给他/她10秒的时间回答每个问题。如果他们在时间限制内回答问题,程序会立即转到下一个问题。另外,如果他们没有在时间限制内回答,程序将在10秒后跳到下一个问题。我知道timer类,如何集成它来实现这一点?这是我目前掌握的代码。别担心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)

Tags: 程序inputrawiftime时间lowerone
1条回答
网友
1楼 · 发布于 2024-03-29 02:29:14

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;您可能需要用^{}安装自己的处理程序。阅读链接的文档,自己测试一下。如果必须安装信号处理程序,那么最好使用其他可用的跨平台信号之一而不是CTRL_C_EVENT,并引发您自己的自定义异常,而不是KeyboardInterrupt。在

相关问题 更多 >