2009-11-19 15 views
5

He detenido una secuencia de comandos para, por ejemplo, 3500 segundos utilizando el módulo de tiempo para ex time.sleep (3500).Escaneo de teclas en Python

Ahora, mi objetivo es buscar las pulsaciones de tecla mientras el script está en reposo, es decir, está en esta línea.

Es como si quisiera reiniciar la secuencia de comandos si se presiona "presionar Ctrl + R".

Por ej .. consideran

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

Ahora mientras que el código está en la última línea, si presiono Ctrl + R, quiero volver a imprimir "Hola .. nuevo" línea.

+4

Es posible que desee ver cómo funciona este sitio web. Hasta el momento, no ha emitido ni un solo voto ni aceptado una sola respuesta. Esa es mala forma. – Stephan202

+0

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

+0

sorry .. Soy muy nuevo en este foro. –

Respuesta

4

Soy consciente de que esto no responde plenamente a su pregunta, pero que podría ser la siguiente:

  1. poner el código lógica del programa en función, por ejemplo perform_actions. Llámalo cuando comience el programa.
  2. Después de ejecutar el código, comience a escuchar un interrupt.
    • Esto es, el usuario debe presionar ctrl + c en lugar de ctrl + r.
  3. Al recibir una interrupción, espere medio segundo; si se vuelve a presionar ctrl + c, salga.
  4. De lo contrario, reinicie el código.

Así, una interrupción se comporta como desee ctrl +r comportarse. Dos interrupciones rápidas abandonan el programa.

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 bonito efecto secundario del uso de una señal (en este caso SIGINT) es que también se reinicia la secuencia de comandos a través de otros medios, por ejemplo, ejecutando kill -int <pid>.

+0

Una solución con ctrl + r hubiera sido mejor;) – tuergeist

+0

ya ... esto tampoco está mal. Quiero decir que resuelve mi problema por ahora. Pero, quiero saber cómo puedo usar esto con cualquier otra combinación ... Si alguien sabe, los pls continúan respondiendo ... –

-2

en un bucle de dormir 3500 veces durante 1 segundo comprobando si se ha pulsado una tecla cada vez

# 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

¿Por qué ejecuto el ciclo innecesariamente? ¿Cómo podemos hacerlo mientras el programa está en estado de suspensión? –

+0

La respuesta está muy lejos de una solución. No hay nada resuelto – tuergeist

3

Es posible que desee utilizar Tkinter {X necesita :(}

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

Este script Hello World grabados en la consola Si pulsa ctrl+r

Véase también Tkinter keybindings. Otra solución utiliza GTK se puede encontrar here

+0

Dado que Tkinker no es un módulo estándar. Ojalá hubiera una solución diferente. –

+0

IFAIK No hay manera de enlazar claves sin usar una biblioteca X o widget. Por lo tanto, debe usar qt, gtk o tkinter :). Puede visitar http://kaizer.se/wiki/python-keybinder/, que propone un mecanismo de enlace de claves para python. Pero esto no es una python estándar también. – tuergeist

Cuestiones relacionadas