6 Stimmen

Tastendruck in Python abfragen

Ich habe ein Skript für sagen wir 3500 Sekunden angehalten, indem ich z. B. das Zeitmodul time.sleep(3500) verwendet habe.

Nun, mein Ziel ist es, für Tastendrucke zu scannen, während das Skript auf Schlaf ist, ich meine seine auf dieser Zeile.

Es ist, als ob ich das Skript neu starten möchte, wenn ein "Strg+R" drücken gedrückt wird.

Zum Beispiel betrachten

#!/usr/bin/python
import time
print "Hello.. again"
while True:
     time.sleep(3500)

Jetzt, während der Code in der letzten Zeile ist, wenn ich Strg+R drücke, möchte ich "Hallo wieder" Zeile neu drucken.

4 Stimmen

Vielleicht möchten Sie sich informieren, wie diese Website funktioniert. Bislang haben Sie weder eine einzige Stimme abgegeben noch eine einzige Antwort akzeptiert. Das ist schlechtes Benehmen.

0 Stimmen

0 Stimmen

Entschuldigung Bin sehr neu in diesem Forum.

4voto

Stephan202 Punkte 57491

Ich bin mir bewusst, dass dies keine vollständige Antwort auf Ihre Frage ist, aber Sie könnten Folgendes tun:

  1. Fügen Sie den Programmlogikcode in eine Funktion ein, zum Beispiel perform_actions . Rufen Sie es auf, wenn das Programm startet.
  2. Nachdem der Code ausgeführt wurde, warten Sie auf eine unterbrechen .
    • Das heißt, der Benutzer muss die Taste ctrl + c 代わりに ctrl + r .
  3. Beim Empfang eines Interrupts eine halbe Sekunde warten; wenn ctrl + c erneut gedrückt wird, dann beenden.
  4. Andernfalls starten Sie den Code neu.

So verhält sich ein Interrupt wie gewünscht ctrl + r sich zu verhalten. Zwei kurze Unterbrechungen beendeten das Programm.

import time

def perform_actions():
    print("Hello.. again")

try:
    while True:
        perform_actions()
        try:
            while True: time.sleep(3600)
        except KeyboardInterrupt:
            time.sleep(0.5)
except KeyboardInterrupt:
    pass

Ein schöner Nebeneffekt der Verwendung eines Signals (in diesem Fall SIGINT ) ist, dass Sie das Skript auch auf andere Weise neu starten, z. B. indem Sie kill -int <pid> .

0 Stimmen

Eine Lösung mit ctrl+r wäre schöner gewesen ;)

0 Stimmen

Ja... das ist auch nicht schlecht. Ich meine, es löst mein Problem für den Moment. Aber, ich möchte wissen, wie kann ich dies mit einer anderen Kombination verwenden... Wenn jemand weiß, bitte weiter antworten...

3voto

tuergeist Punkte 8511

Vielleicht möchten Sie Tkinter {braucht X :(} verwenden.

#!/usr/bin/env python

from Tkinter import * # needs python-tk

root = Tk()

def hello(*ignore):
    print 'Hello World'

root.bind('<Control-r>', hello)
root.mainloop() # starts an X widget

Dieses Skript druckt Hello World zur Konsole, wenn Sie die Taste ctrl+r

Siehe auch Tkinter-Tastaturbindungen . Eine andere Lösung verwendet GTK kann gefunden werden aquí

0 Stimmen

Da Tkinker kein Standardmodul ist. Ich wünschte, es gäbe eine andere Lösung.

0 Stimmen

IFAIK Es gibt keine Möglichkeit, Tasten zu binden, ohne eine X- oder Widget-Bibliothek zu verwenden. So müssen Sie qt, gtk oder tkinter verwenden :) Vielleicht möchten Sie folgendes besuchen kaizer.se/wiki/python-keybinder das einen Mechanismus für Schlüsselbindungen für Python vorschlägt. Aber auch das ist kein Standard-Python.

-2voto

In einer for-Schleife 3500 Mal für 1 Sekunde schlafen und jedes Mal prüfen, ob eine Taste gedrückt wurde

# sleep for 3500 seconds unless ctrl+r is pressed
for i in range(3500):
    time.sleep(1)
    # check if ctrl+r is pressed
    # if pressed -> do something
    # otherwise go back to sleep

1 Stimmen

Warum wird die Schleife unnötigerweise ausgeführt? Wie können wir es tun, während das Programm im Ruhezustand ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X