Seite 1 von 1

Python Timer

Verfasst: Mittwoch 28. Oktober 2009, 23:34
von Rumble
Schönen Guten Abend!
Mein Problem ist, dass ich eine Idee habe aber nicht weiß wie ich die umsetzen kann. Das ganze sollte in etwa so sein, dass Python quasi fragt ob jemand da ist und der jenige soll einfach enter drücken. Wenn er dies nicht tut, soll eine entsprechende Nachricht erscheinen.

Was ist an dieser Syntax falsch?
(Ich vermute man kann das mit "if" nicht machen, oder?)

Code: Alles auswählen

print ("Hi DU, drück enter!")
a = raw_input("press enter")
import time
if time.sleep(2):
    print ("Du bist zu spät!")
else:
    print ("Gut so...")

Verfasst: Mittwoch 28. Oktober 2009, 23:43
von SigMA
Das was du suchst nennt sich "threads" lass den "timer" in einem eigenen Thread laufen, der deinen Mainloop dann unterbricht.

Im Moment wird dein Programm linear ausgeführt. Erst die erste Zeile, dann die Zweite, bei raw_input wartet er und dann kommt die IF-Abfrage. Mit Threads sorgst du dafür, dass mehrere Sachen nebeneinander ausgeführt werden, sodass das Programm mehrere Sachen Gleichzeitig machen kann. Quasi weibliche Programmierung.

gruß, SigMA

Verfasst: Donnerstag 29. Oktober 2009, 12:14
von ms4py
SigMA hat geschrieben:Quasi weibliche Programmierung.
:D

@OP: Ganz so einfach ist das Problem nicht zu lösen, du willst ja den Input abbrechen, falls der Benutzer eine zeitlang nichts eingibt, hab ich das richtig verstanden?

Edit:
Wusst ich doch, dass wir die Frage schon mal hatten, keine Garantie, dass das funtioniert:
http://www.python-forum.de/post-143168.html#143168

Edit2:
Wenn ich mir den Code genauer anschaue, bezweifele ich, dass der richtig funktioniert. Auf jeden Fall funktioniert danach im MainThread die raw_input-Funktion nicht mehr.
Außerdem müsste noch die Variable ``Eingabe`` mit einem Lock gesichert werden.

Verfasst: Donnerstag 29. Oktober 2009, 13:32
von jerch
Arbeitest Du an einer "echten" Konsole (DOS-Eingabeaufforderung oder Terminalemulator unter Linux/Unices) geht das mit einer Kombination aus kbhit() und getch() bzw. getwch():

Code: Alles auswählen

import time
starttime = time.time()
while starttime+10 > time.time():
    time.sleep(.1) # nimm dem busy wait ein wenig business
    if kbhit() and ord(getwch())==10:
        print "gut so..."
        break
else:
    print "zu spät"
kbhit() und getwch() findest Du in [mod]msvcrt[/mod] für Windows oder hier als Posixversion für Linux/Unix, wobei letzteres noch in der Umarbeitung ist.

Edit:
Die Posixvariante von kbhit() unterstützt auch ein timeout Argument (in ms), wodurch die Sache einfacher wird (sich aber auch etwas anders verhält):

Code: Alles auswählen

if kbhit(timeout=10000) and ord(getwch())==10:
    print "gut so"
else:
    print "zu spaet bzw. falsche taste"