簡體   English   中英

用於計時的Python計時器

[英]Python timer for timing

該程序詢問用戶問題,但只給他/她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)

在用戶鍵入某些內容之前, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM