Heim > Backend-Entwicklung > Python-Tutorial > Wie kann ich zeitgebundene Benutzereingaben in Python implementieren?

Wie kann ich zeitgebundene Benutzereingaben in Python implementieren?

Susan Sarandon
Freigeben: 2024-11-27 07:43:16
Original
453 Leute haben es durchsucht

How Can I Implement Time-Bound User Input in Python?

Zeitgebundene Benutzereingaben: Lösungen erkunden

In der dynamischen Welt der Programmierung ist es häufig notwendig, Benutzereingaben zeitliche Beschränkungen aufzuerlegen . Stellen Sie sich das Szenario vor, in dem Sie einem Benutzer eine Frage stellen und die Zeit begrenzen möchten, die er zum Antworten hat. Die Bewältigung dieser Aufgabe in Python mag einfach erscheinen, bringt jedoch eine Reihe eigener Herausforderungen mit sich.

Ein Ansatz besteht darin, das Threading-Modul zu verwenden. Indem Sie ein Timer-Objekt erstellen und dessen Dauer festlegen, können Sie einen Countdown starten. Während dieser Zeit bleibt der Code blockiert und wartet auf Benutzereingaben. Läuft die Zeit ab, bevor eine Antwort eintrifft, kann eine entsprechende Meldung angezeigt werden. Der folgende Codeausschnitt veranschaulicht diesen Ansatz:

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()
Nach dem Login kopieren

Diese Methode hat jedoch ihre Grenzen. Das Blockieren des Hauptthreads kann die Ausführung anderer Aufgaben innerhalb des Programms behindern. Daher werden alternative Ansätze erforderlich, die einen nicht blockierenden Betrieb ermöglichen.

Betriebssystemspezifische Lösungen

Für Windows-Systeme können Sie msvcrt Modul, das eine Low-Level-Schnittstelle für Tastatureingaben bereitstellt. Die Ausnahme TimeoutExpired wird ausgelöst, wenn das angegebene Zeitlimit überschritten wird, sodass Sie entsprechend mit der Situation umgehen können. Hier ist eine Implementierung:

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
Nach dem Login kopieren

Unix-basierte Verbesserungen

Auf Unix-ähnlichen Systemen können Sie das Modul

select erkunden. Damit können Sie Dateideskriptoren überwachen und auf bestimmte Ereignisse warten, einschließlich Tastatureingaben innerhalb eines bestimmten Zeitrahmens. Der folgende Codeausschnitt veranschaulicht diese Technik:

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
Nach dem Login kopieren
Alternativ können Sie das Modul

Signal verwenden. Indem Sie einen Timer einstellen und das resultierende SIGALRM-Signal verarbeiten, können Sie der Benutzereingabe eine Zeitbeschränkung auferlegen. So geht's:

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
Nach dem Login kopieren
Diese Ansätze bieten nicht blockierende Alternativen zu zeitlich begrenzten Benutzereingaben und sorgen für mehr Flexibilität und Kontrolle innerhalb Ihrer Python-Programme.

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

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage