【问题标题】:Function running as a timer goes down?作为计时器运行的功能下降?
【发布时间】:2015-11-11 18:57:26
【问题描述】:

我真的是编程新手,我正在尝试为幼儿创建一个数学测验。他们必须在 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!")

【问题讨论】:

    标签: python function math testing timer


    【解决方案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() 调用已经“阻塞”了,你只能同时运行一个阻塞函数(除非你引入线程或多个进程,这在这里完全是矫枉过正)。

    最后一个问题,如果回答正确,将计为 +1,即使它是在 60 多秒后回答的。可以通过让questions() 返回 True 或 False 来更改此逻辑,并且仅当它返回 True 时才执行 score += 1 部分并且如果还有时间。

    如果您想在 60 秒后真正被打断,那就有点难了。尝试例如signal.alarm(60)(不在 Windows 上)。它将在给定的秒数后发出“闹钟”信号。默认情况下,它会终止进程;如果您想抓住它并做其他事情,请尝试另外做:signal.signal(signal.SIGALRM, signal.default_int_handler)。它将在 60 秒后模拟 Ctrl-C,您可以使用:

    try:
        while True:   # infinite loop, until interrupted
            questions()
    except KeyboardInterrupt:
        pass          # interrupted, now we're out of the loop
    

    (此版本不再需要time.time()。)

    【讨论】:

    • 非常感谢,这真的很有帮助,我只需要弄清楚在剩余 30 秒和 10 秒时如何播放声音
    • 然后做signal.signal(signal.SIGALRM, my_func);然后将调用您的函数 my_func 而不是 Ctrl-C。您最初在 30 秒后设置了闹钟,然后您的函数会播放声音并在 20 秒后设置下一个闹钟,依此类推。
    • 另一种选择:除了使用signal,您还可以使用thread.start_new_thread(my_thread, ())。然后my_thread() 被调用一次,但并行(在不同的线程中)。它会time.sleep(30)、播放声音、多睡觉等等,最后它会调用thread.interrupt_main()。与上一个解决方案的不同之处在于my_thread() 被调用一次,但可以在不暂停运行input() 的“主线程”的情况下休眠。
    【解决方案2】:

    multiprocessing 库中尝试Process。查看其他答案:https://stackoverflow.com/a/7207336/583834

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 2019-01-29
      • 1970-01-01
      • 2015-04-10
      • 2012-02-12
      • 2019-08-04
      相关资源
      最近更新 更多