1

我正在尝试使用计时器在 Python 中获取用户输入。我希望用户只有 10 秒的时间来输入内容。但是,当 10 秒结束时,消息“时间到了!” 已打印,但脚本不会停止。

import pygame
from threading import Thread

clock = pygame.time.Clock()
timee = 0
UIn=None

def func1():
    global timee
    global clock
    global UIn
    while True:
        milli = clock.tick()
        seconds = milli/1000

        timee=timee+seconds
        if(int(timee)==10):
            print("Time is over")
            quit()
        

def func2():
    global UIn
    print("Working")
    input("Press key:\t")


Thread(target=func1).start()
Thread(target=func2).start()
UIn=input("Press key:\t")
4

2 回答 2

0

经过一番思考并感谢@Rabbid76,您可能想要这样的东西(根据this great post的代码修改):

import msvcrt
import time
import sys

class TimeoutExpired(Exception):
    pass

def input_with_timeout(prompt, timeout, timer=time.monotonic):
    """Timed input function, taken from https://stackoverflow.com/a/15533404/12892026"""
    sys.stdout.write(prompt)
    sys.stdout.flush()
    endtime = timer() + timeout
    result = []
    while timer() < endtime:
        if msvcrt.kbhit():
            result.append(msvcrt.getwche()) #XXX can it block on multibyte characters?
            if result[-1] == '\r':
                return ''.join(result[:-1])
        time.sleep(0.04) # just to yield to other processes/threads
    raise TimeoutExpired

# create a timed input object
try:
    answer = input_with_timeout("Give me an answer: ", 10)
except TimeoutExpired:
    print('\nSorry, times up')
else:
    print(f'\nYour answer was: {answer}')

# continue with code and verify the input
if answer:
    if answer == "yes":
        print("OK")
于 2021-10-03T14:30:59.223 回答
0

您可以Timer为此目的使用该类

from threading import Timer

timeout = 10
t = Timer(timeout, print, ['Sorry, times up!'])
t.start()
prompt = "You have %d seconds to answer the question. What color do cherries have?...\n" % timeout
answer = input(prompt)
t.cancel()

输出:

You have 10 seconds to answer the question. What color do cherries have?
(After 10 seconds)
Sorry, times up!
于 2021-10-03T14:03:42.013 回答