Сканирование нажатия клавиш в Python - PullRequest
6 голосов
/ 19 ноября 2009

Я приостановил выполнение сценария, скажем, 3500 секунд, используя модуль времени для ex time.sleep (3500).

Теперь моя цель - сканировать нажатия клавиш, когда скрипт находится в спящем режиме, я имею в виду его в этой строке.

Это похоже на то, что я хочу перезапустить скрипт, если нажата "нажатие клавиши Ctrl + R" .

Например, рассмотрим

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

Теперь, когда код находится в последней строке, если я нажму Ctrl + R, я хочу снова напечатать строку «Hello .. again».

Ответы [ 3 ]

4 голосов
/ 19 ноября 2009

Я знаю, что это не полностью отвечает на ваш вопрос, но вы можете сделать следующее:

  1. Поместите программный логический код в функцию, скажем, perform_actions. Позвоните, когда программа запустится.
  2. После запуска кода начните прослушивание прерывания .
    • То есть пользователь должен нажать ctrl + c вместо ctrl + r .
  3. Получив прерывание, подождите полсекунды; если снова нажать ctrl + c , затем выйти.
  4. В противном случае перезапустите код.

Таким образом, одно прерывание ведет себя так, как вы хотите ctrl + r . Два быстрых прерывания выходят из программы.

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

Приятным побочным эффектом использования сигнала (в данном случае SIGINT) является то, что вы также перезапускаете сценарий другими способами, например, запустив kill -int <pid>.

3 голосов
/ 19 ноября 2009

Вы можете использовать Tkinter {нужен 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

Этот скрипт выводит Hello World на консоль, если вы нажимаете ctrl+r

См. Также Связки клавиш Tkinter . Другое решение использует GTK можно найти здесь

0 голосов
/ 19 ноября 2009

в цикле ожидания 3500 раз в течение 1 секунды, проверяя, была ли нажата клавиша каждый раз

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...