Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich zeitlich begrenzte Benutzereingaben in der Programmierung umsetzen?

Wie kann ich zeitlich begrenzte Benutzereingaben in der Programmierung umsetzen?

DDD
DDDOriginal
2024-11-26 17:22:13677Durchsuche

How Can I Implement Time-Limited User Input in Programming?

Eingabe mit Zeitbeschränkung

Beim Programmieren kann es von Vorteil sein, die Benutzereingaben zeitlich zu begrenzen. Beispielsweise möchten Sie den Benutzern möglicherweise eine Frage stellen und ihnen eine begrenzte Antwortzeit einräumen, z. B.:

print('some scenario')
prompt = input("You have 10 seconds to choose the correct answer...\n")

Wenn der Benutzer das Zeitlimit überschreitet, können Sie eine Nachricht wie diese anzeigen:

print('Sorry, times up.')

Lösungen für zeitlich begrenzte Eingaben

Berücksichtigen Sie diese, um zeitlich begrenzte Eingaben zu implementieren Optionen:

  • Blockieren des Hauptthreads: Wenn es akzeptabel ist, die Ausführung Ihres Codes zu blockieren, während der Benutzer Eingaben bereitstellt, können Sie ein Timer-Objekt verwenden:
from threading import Timer

timeout = 10
t = Timer(timeout, print, ['Sorry, times up'])
t.start()
prompt = "You have %d seconds to choose the correct answer...\n" % timeout
answer = input(prompt)
t.cancel()
  • Nicht blockierende Eingabe (Windows): Um ein Blockieren des Hauptthreads zu vermeiden, können Sie verwenden Die folgende Methode unter Windows (beachten Sie, dass dieser Ansatz nicht getestet wurde):
import msvcrt
import time

class TimeoutExpired(Exception):
    pass

def input_with_timeout(prompt, timeout, timer=time.monotonic):
    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
  • Nicht blockierende Eingabe (Unix): Alternativ auf Unix-Basis Systeme können Sie einen der folgenden Ansätze verwenden:
import select
import sys

def input_with_timeout(prompt, timeout):
    sys.stdout.write(prompt)
    sys.stdout.flush()
    ready, _, _ = select.select([sys.stdin], [],[], timeout)
    if ready:
        return sys.stdin.readline().rstrip('\n')  # expect stdin to be line-buffered
    raise TimeoutExpired
import signal

def alarm_handler(signum, frame):
    raise TimeoutExpired

def input_with_timeout(prompt, timeout):
    # set signal handler
    signal.signal(signal.SIGALRM, alarm_handler)
    signal.alarm(timeout)  # produce SIGALRM in `timeout` seconds

    try:
        return input(prompt)
    finally:
        signal.alarm(0)  # cancel alarm

Durch die Implementierung dieser Methoden können Sie Zeitbeschränkungen effektiv anwenden Benutzereingaben, Verbesserung der Benutzererfahrung und Steuerung des Programmflusses.

Das obige ist der detaillierte Inhalt vonWie kann ich zeitlich begrenzte Benutzereingaben in der Programmierung umsetzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn