Seite 1 von 1

Eingabe mit Zeitbeschränkung

Verfasst: Dienstag 29. März 2011, 20:18
von JFK
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

Re: Eingabe mit Zeitbeschränkung

Verfasst: Dienstag 29. März 2011, 20:30
von deets
Du musst uns schon verraten, *wie* du eine Eingabe vom User anstrebst. Da gibt's ja 2 1/2 Moeglichkeiten...

Re: Eingabe mit Zeitbeschränkung

Verfasst: Dienstag 29. März 2011, 20:36
von JFK
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

Re: Eingabe mit Zeitbeschränkung

Verfasst: Dienstag 29. März 2011, 21:33
von 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!"

Re: Eingabe mit Zeitbeschränkung

Verfasst: Mittwoch 30. März 2011, 09:38
von JFK
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ß

Re: Eingabe mit Zeitbeschränkung

Verfasst: Mittwoch 30. März 2011, 13:25
von Xynon1
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?

Re: Eingabe mit Zeitbeschränkung

Verfasst: Montag 4. April 2011, 14:51
von JFK
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

Re: Eingabe mit Zeitbeschränkung

Verfasst: Montag 4. April 2011, 15:19
von Xynon1
Mit welcher Konsole hast du es denn ausprobiert?

Re: Eingabe mit Zeitbeschränkung

Verfasst: Montag 4. April 2011, 15:21
von JFK
Mit IDLE,... kann es an der Konsole liegen ?!

Re: Eingabe mit Zeitbeschränkung

Verfasst: Montag 4. April 2011, 15:22
von Xynon1
Das ist keine Konsole sondern eine auf Tkinter basierende IDE mit einer Python Shell, damit geht "kbhit" nicht.

Re: Eingabe mit Zeitbeschränkung

Verfasst: Montag 4. April 2011, 15:28
von JFK
ok,... danke,...

Re: Eingabe mit Zeitbeschränkung

Verfasst: Montag 4. April 2011, 15:32
von Xynon1
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.

Re: Eingabe mit Zeitbeschränkung

Verfasst: Montag 4. April 2011, 17:32
von JFK
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

Re: Eingabe mit Zeitbeschränkung

Verfasst: Montag 4. April 2011, 17:48
von 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.

Re: Eingabe mit Zeitbeschränkung

Verfasst: Montag 4. April 2011, 18:23
von JFK
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?

Re: Eingabe mit Zeitbeschränkung

Verfasst: Montag 4. April 2011, 18:25
von JFK
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

Re: Eingabe mit Zeitbeschränkung

Verfasst: Montag 4. April 2011, 19:56
von Xynon1
Ups, mein Fehler hatte ich vergessen.