2009-11-19 10 views
5

J'ai mis en pause un script pour laisser dire 3500 secondes en utilisant le module de temps pour ex time.sleep (3500). Maintenant, mon but est de balayer les frappes pendant que le script est en veille, je veux dire c'est sur cette ligne.Scanner Keypress en Python

Son comme je veux redémarrer le script si un "touchez Ctrl + R" est pressé.

Ex .. Ne manquez alors que le code

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

est à la dernière ligne, Si j'appuyez sur Ctrl + R, je veux réimprimer la ligne « Bonjour .. encore une fois ».

+4

Vous voudrez peut-être examiner le fonctionnement de ce site Web. Jusqu'à présent, vous n'avez pas voté une seule fois, ni accepté une seule réponse. C'est une mauvaise forme. – Stephan202

+0

Dupliquer: http://stackoverflow.com/questions/694296/detect-in-python-which-keys-are-pressed –

+0

désolé .. Je suis très nouveau sur ce forum. –

Répondre

4

Je sais que cela ne répond pas complètement à votre question, mais vous pouvez faire ce qui suit:

  1. Mettez le code logique de programme en fonction, par exemple perform_actions. Appelez-le quand le programme démarre. Une fois le code exécuté, commencez à écouter un interrupt.
    • C'est, l'utilisateur doit appuyer sur ctrl + c au lieu de ctrl +r.
  2. À la réception d'une interruption, attendez une demi-seconde; si ctrl + c est de nouveau pressée, puis quitte.
  3. Sinon, redémarrez le code.

Ainsi une interruption se comporte comme vous voulez ctrl +r se comporter. Deux interruptions rapides quittent le programme.

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 

Un joli effet secondaire d'utiliser un signal (dans ce cas SIGINT) est que vous redémarrez également le script par d'autres moyens, par exemple en exécutant kill -int <pid>.

+0

Une solution avec ctrl + r aurait été plus agréable;) – tuergeist

+0

ya .. c'est aussi pas mal. Je veux dire que ça résout mon problème pour le moment. Mais, je veux savoir comment puis-je l'utiliser avec n'importe quelle autre combinaison ... Si quelqu'un sait, pls continue de répondre .. –

-2

dans un sommeil de boucle 3500 fois pendant 1 seconde vérifier si une touche a été pressée à chaque fois

# 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

Pourquoi dois-je exécuter la boucle inutilement? Comment pouvons-nous le faire pendant que le programme est en état de veille. –

+0

Réponse est loin d'une solution. Il n'y a rien résolu. – tuergeist

3

Vous pouvez utiliser Tkinter {besoins X :(}

#!/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 

Ce script imprime Hello World à la console si vous appuyez sur ctrl+r

Voir aussi Tkinter keybindings. Une autre solution utilise GTK se trouve here

+0

Puisque Tkinker n'est pas un module standard. J'aimerais qu'il y ait une solution différente. –

+0

IFAIK Il n'y a aucun moyen de lier les clés sans utiliser de bibliothèque X ou de widget. Donc, vous devez utiliser qt, gtk ou tkinter :) Vous pouvez visiter http://kaizer.se/wiki/python-keybinder/ qui propose un mécanisme de liaison de clé pour python. Mais ce n'est pas un python standard aussi. – tuergeist