Seite 1 von 1

[gelöst] Keyboard events im Hintergrund abfragen

Verfasst: Freitag 25. Juli 2008, 16:45
von zoranthus
Hallo,

Ich möche ein Programm schreiben, das einmal pro Sekunde einen bestimmten output auf den Bildschirm bringt und gleichzeitig Tastatureingaben auswertet, sofern sie gemacht wurden.

Ganz simples Beispiel:

Code: Alles auswählen

import time, sys
for x in range(10):
	print x
	print raw_input(">")
	time.sleep(1)
Das Problem ist, dass er jedesmal auf die Eingabe wartet, bevor er mit dem Countdown weitermacht. Er soll aber nach einer Sekunde weiterzählen und damit leben, dass es zu dem Zeitpunkt halt keine Eingabe gab.
Mit getch() von curses ist es dasselbe ohne die Notwendigkeit Enter zu drücken. Auch sys.stdin in irgendeiner Form auszulesen läuft daraus hinaus. Weiß jemand Rat?

Verfasst: Freitag 25. Juli 2008, 17:52
von Rebecca
Dazu benoetigst du Threads: [mod]Threading[/mod]

Verfasst: Freitag 25. Juli 2008, 19:10
von zoranthus
Ah.... Thread.join(n)... danke. :)

Verfasst: Freitag 25. Juli 2008, 19:30
von Rebecca
Der eine Thread bleibt beim raw_input stehen, der andere laeuft weiter:

Code: Alles auswählen

import threading
import time

class Counter(threading.Thread):
    def run(self):
        for i in range(10):
            print i
            time.sleep(1)

counter = Counter()
counter.start()

while True:
    print raw_input("> ")

Re: Keyboard events im Hintergrund abfragen

Verfasst: Freitag 25. Juli 2008, 20:19
von sma
zoranthus hat geschrieben:Mit getch() von curses ist es dasselbe ohne die Notwendigkeit Enter zu drücken.
Wenn curses kein Problem ist (läuft nicht unter Windows), dann reicht es doch gemäß der Dokumentation auf `nodelay` umzuschalten und es kommt dann `-1` zurück, wenn zwischenzeitlich keine Taste gedrückt wurde.

Stefan

Verfasst: Freitag 25. Juli 2008, 21:30
von zoranthus
Vielen Dank ihr beiden!

@sma: Was soll ich sagen, dank dieses Switches läuft mein Programm jetzt wie es soll, ohne dass ich sonst irgendwas machen musste, merci. :D Linux only ist kein Problem, da das Programm eh nur ein wrapper für mplayer und streamripper in der cli-version ist. (Livestraeam per mplayer hören und gleichzeitig mit streamripper aufnehmen - bei Gefallen auf "knopfdruck" das lied behalten, sonst automatisch wieder löschen - der Knopfdruck bei gleichzeitiger Info über das aktuelle Lied war halt das Problem)

@Rebecca: Ah, ich dachte du meinst "nur" die Timeout-Funktion von Thread.join(n) wie in:

Code: Alles auswählen

a = raw_input()
t = threading.Thread(target=input)
t.start()
t.join(1)
dein Vorschlag ist wohl definitiv die elegantere Lösung. Ich hab Threads bislang nur zur Deadlockvermeidung bei Objekten benutzt, aber so könnte man natürlich auch i/o-Streams koordinieren. Das output-update könnte man in eine Schleife packen, deren Abbruchbedingung man z.B. über den input-thread steuern kann.