[gelöst] Keyboard events im Hintergrund abfragen

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
zoranthus
User
Beiträge: 4
Registriert: Mittwoch 9. Mai 2007, 17:11

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?
Zuletzt geändert von zoranthus am Freitag 25. Juli 2008, 21:31, insgesamt 1-mal geändert.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dazu benoetigst du Threads: [mod]Threading[/mod]
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
zoranthus
User
Beiträge: 4
Registriert: Mittwoch 9. Mai 2007, 17:11

Ah.... Thread.join(n)... danke. :)
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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("> ")
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
zoranthus
User
Beiträge: 4
Registriert: Mittwoch 9. Mai 2007, 17:11

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.
Antworten