Eingabe mit Zeitbeschränkung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JFK
User
Beiträge: 9
Registriert: Dienstag 29. März 2011, 20:13

Wie kann ich es realisieren, dass z.B wenn die Eingabe zu lange dauert, dass das Programm dann weiter läuft ?

Gruß und Danke

JFK
deets

Du musst uns schon verraten, *wie* du eine Eingabe vom User anstrebst. Da gibt's ja 2 1/2 Moeglichkeiten...
JFK
User
Beiträge: 9
Registriert: Dienstag 29. März 2011, 20:13

Sorry,...

Eingabe geht über die Eingabeaufforderung, mit

y=input()

und hier möchte ich, dass wenn der Benutzer zu lange braucht das Programm weiterläuft

hoffe du meintest es so?

Bin momentan auch noch Python Neuling
deets

Ok, das hilft schonmal. Was ich haette auch gleich fragen sollen: unter welchem Betriebssystem? Wenn's was unix-artiges ist, dann sollte zB signal.alarm helfen.

http://docs.python.org/library/signal.html#signal.alarm

Code: Alles auswählen


import signal


class Timeout(Exception): pass


def alarm_handler(*_args):
    raise Timeout()


signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(5)

try:
    foo = input("eingabe:")
except Timeout:
    print "und weiter geht's!"
JFK
User
Beiträge: 9
Registriert: Dienstag 29. März 2011, 20:13

wollte es eigentlich unter Windows laufen lassen,....

hatte nicht dran gedacht, zu sagen auf welchen BS weil ich dachte dass man es Platform unabhängig machen könnte :/

wie würde es für windows aussehen?

danke und gruß
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Vieleicht so ein Konstruckt (geht wiederum nur unter win)

Code: Alles auswählen

import threading
import msvcrt
import sys

KEY_RETURN = 13

class InputTimer(object):

    def __init__(self, timeout):
        self.running = True
        self.timer = threading.Timer(timeout, self.break_run)
        self._input = []

    @property
    def result(self):
        return "".join(self._input)
        
    def break_run(self):
        self.running = False

    def input(self, prompt=""):
        self._input = []
        self.timer.start()
        sys.stdout.write(prompt)
        while self.running:
            if msvcrt.kbhit():
                key = msvcrt.getche()
                if ord(key) == KEY_RETURN:
                    self.timer.cancel()
                    break
                else:
                    self._input.append(key)
        sys.stdout.write("\n")

        
if __name__ == "__main__":
    it = InputTimer(10.0)
    it.input("Eingabe: ")
    print(it.result)
Nicht sehr schön, aber geht. Hat jemand eine bessere Idee?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
JFK
User
Beiträge: 9
Registriert: Dienstag 29. März 2011, 20:13

Hey,

danke für die Antwort und sorry dass ich nicht mehr so schnell geschrieben habe,...

Ich habe es ausprobiert nur leider funktioniert es bei mir nicht,... denn bei der Funktion

Code: Alles auswählen

   def input(self, prompt=""):
        self._input = []
        self.timer.start()
        sys.stdout.write(prompt)
        while self.running:
            if msvcrt.kbhit():
                key = msvcrt.getche()
                if ord(key) == KEY_RETURN:
                    self.timer.cancel()
                    break
                else:
                    self._input.append(key)
        sys.stdout.write("\n")
kommt er über die Zeile msvcrt.kbhit() ... nicht hinaus,... ich habe es dann auch mal selber in der Konsole ausprobiert und irgendwie funktioniert es nicht?!

Wenn eben mal testweise folgendes mach:

Code: Alles auswählen

while 1:
  if msvcrt.kbhit():
   print("test")
   break
dann läuft die schleife ewig egal wie ich auf den testen rum drücke,...

weiß jemand was schief läuft?

Gruß und Danke
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Mit welcher Konsole hast du es denn ausprobiert?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
JFK
User
Beiträge: 9
Registriert: Dienstag 29. März 2011, 20:13

Mit IDLE,... kann es an der Konsole liegen ?!
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Das ist keine Konsole sondern eine auf Tkinter basierende IDE mit einer Python Shell, damit geht "kbhit" nicht.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
JFK
User
Beiträge: 9
Registriert: Dienstag 29. März 2011, 20:13

ok,... danke,...
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Weißt du wie man ein Python Programm aus einer Konsole startet?

Falls nicht, dann geh mal auf Start-->Ausführen-->"cmd" eingeben-->Ok, dann öffnet sich die Win-Konsole dort musst du dann die "python.exe" aufrufen und als Argument den Script übergeben, etwa so "C:\Python26\python.exe D:\scripts\test.py"

Wenn dir das zum testen zu aufwending erscheint, kannst du auch Rechtsklick auf den Script-->Öffnen mit-->Programm auswählen-->Durchsuchen-->C:\Python26\python.exe-->Öffnen-->Ok-->"Dateityp immer mit dem ausge...." anhaken, dann kannst du die Scripte per Doppelklick ausführen. Musst aber dann in der letzten Zeile immer ein raw_input() unten ranhängen, wenn du keine mainloop hast, ansonsten schließt sich die Anwendung sofort.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
JFK
User
Beiträge: 9
Registriert: Dienstag 29. März 2011, 20:13

Habe es jetzt in der Windows Konsole mal laufen lassen, also genauso wie du den Code geschrieben hattest,..

jetzt kommt der fehler:

TypeError: sequence item 0: expected str instance, bytes found

In die Input liste werden wohl keine strings eingetragen,.. was auch komisch ist, wenn ich das programm starte wir "eingabe:" nicht angezeigt. Erst wenn man Enter drückt und dann kommt eben auch der Fehler,...

Gibt es für IDLE auch die möglichkeit die tastatureingaben abzufragen? Oder wäre, das ganze einfacher wenn ich eine grafische oberfläche modeliere?!

Gruß und vielen dank für deine Hilfe
deets

IDLE ist eine Entwicklungsumgebung. Das sie bestimmte Einschraenkungen hat was die Laufzeit angeht ist schade, aber nicht zu aendern (fuer eine "in vertretbarem Aufwand"-Definition von "aendern")

Was *du* aber in keinem Fall deswegen aendern solltest ist dein Programm. Denn deine Benutzer werden das ja wohl kaum in IDLE ausfuehren, oder?

Und eine GUI hat letztlich dieselben, oder sogar noch groessere Probleme innerhalb von IDLE, weil sich da dann die Event-Loops zweier Programme in die Haare kommen.

Zu dem bytes-Problem: ich habe jetzt nicht in den Code geschaut, aber das schein ein simples Python 3 unicode/byte-string Problem zu sein, da musst du halt das eine in das andere umwandeln.
JFK
User
Beiträge: 9
Registriert: Dienstag 29. März 2011, 20:13

Mit dem umwandeln hat geklappt und so scheint es soweit zu funktionieren.

Ist nur das einzig merkwürdige, dass bei dem pogrammstart das wort "Eingabe:" nicht mit ausgegeben wird,... habe bissle dran rum gespielt
finde da aber keinen Grund warum nicht?

sobald ich zum beispiel sys.stdout.write(prompt + "\n") mach wird es angezeigt.

hättest du da noch eine idee?
JFK
User
Beiträge: 9
Registriert: Dienstag 29. März 2011, 20:13

schon gefunden: sys.stdout.flush()

dachte mir das schon, weil ich es so auch aus C++ kenne ;) habs nur beim ersten mal googlen nicht gleich gefunden
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Ups, mein Fehler hatte ich vergessen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten