Обнаружить комбинацию нажатий клавиш в Linux с Python? - PullRequest
4 голосов
/ 05 февраля 2009

Я пытаюсь запечатлеть нажатия клавиш, чтобы при нажатии данной комбинации я вызывал событие.

Я искал советы о том, как начать работу, и самый простой фрагмент кода, который я могу найти, находится в Python - для этого я взял код ниже с здесь Однако, когда я запускаю это из терминала и нажимаю некоторые клавиши, после оператора «Нажать клавишу ...» ничего не происходит.

Я что, глупый? Может кто-нибудь объяснить, почему ничего не происходит, или предложить лучший способ достижения этого в Linux (на любом языке!)?

import Tkinter as tk

def key(event):
    if event.keysym == 'Escape':
        root.destroy()
    print event.char

root = tk.Tk()
print "Press a key (Escape key to exit):"
root.bind_all('<Key>', key)
# don't show the tk window
root.withdraw()
root.mainloop()

Ответы [ 4 ]

3 голосов
/ 05 февраля 2009

Тк, кажется, не получает его, если вы не отображаете окно. Попробуйте:

import Tkinter as tk

def key(event):
    if event.keysym == 'Escape':
        root.destroy()
    print event.char

root = tk.Tk()
print "Press a key (Escape key to exit):"
root.bind_all('<Key>', key)
# don't show the tk window
# root.withdraw()
root.mainloop()

у меня работает ...

1 голос
/ 12 января 2010

В качестве альтернативы (без Python) используйте XBindKeys .

1 голос
/ 05 февраля 2009

Что ж, оказывается, есть гораздо более простой ответ при использовании GNOME, который вообще не требует программирования ...

http://www.captain.at/howto-gnome-custom-hotkey-keyboard-shortcut.php

Архивируется в обратном направлении

Просто создайте скрипт / исполняемый файл, который будет запускаться комбинацией клавиш, и укажите на него запись 'keybinding_commands', которую вы создаете в gconf-editor.

Почему я не подумал об этом раньше?

1 голос
/ 05 февраля 2009

То, что вы делаете, читает /dev/tty в «сыром» режиме.

Обычный ввод для Linux «приготовлен» - для вас обработаны символы возврата и окончания строк.

Чтобы прочитать устройство, такое как клавиатура, в «сыром» режиме, вам нужно сделать прямые вызовы API Linux в IOCTL.

Посмотрите на http://code.activestate.com/recipes/68397/ для получения некоторых указаний по этому вопросу. Да, рецепт находится в tcl, но он подсказывает вам, как поступить.

...