Клавиша печати нажимает на экран мгновенно с Python - PullRequest
0 голосов
/ 27 мая 2011

Я знаю, что этот вопрос длинный, но то, что я действительно хочу знать, выделено жирным шрифтом.

Я бы предпочел использовать python в Linux.

Я пытаюсь сделать новую раскладку клавиатуры вроде devorak, но раскладка настроена на layout1 или layout2 в зависимости от того, удерживаете ли вы горячую клавишу или нет (горячая клавиша, вероятно, должна быть ctrl?)

например. нажмите d -> "z" распечатывает на экране, используя раскладку клавиши1

например. нажмите ctrl d -> «x» для печати на экране с помощью клавиши layout2

Моя главная проблема (и вопрос, на который нужно ответить) - способ вывода символов на экран.

если кто-то нажимает клавиши (в этом порядке) "(a) (b) (c) (d) (ctrl + d) (shift + e = E) (f) (Enter)"

теперь допустим, что вывод для этих нажатий клавиш должен быть «oijzxKb» Я не хочу, чтобы вывод отображался с новыми строками:

o
i
j
z
x
K
b

Я хочу, чтобы символы мгновенно появлялись на экране при нажатии каждого символа (не дожидаясь их нажатия клавиши ввода).

e.g.
press o

Screenshot1 o

press i

Screenshot2 oi

press j

Screenshot3 oij

.. etc

Полагаю, мне понадобится следующее:

  • способ мгновенного считывания нажатий клавиш
  • способ мгновенной печати нажатий клавиш (в терминал, в графический интерфейс или в другое удобное место, если он работал на любом редакторе, который был бы крут!)

Возможно, я мог бы сделать это в PyGame (но тогда я, вероятно, не смог бы вырезать, вставлять и т. Д.), И я предполагаю, что должен быть более простой способ.

Я использую клавиатуру Logitech G110, возможно, мне захочется использовать ее в качестве альтернативы клавиатуре qwerty во всех моих приложениях на всех моих устройствах.

Спасибо!

РЕДАКТИРОВАТЬ: РЕШЕНИЕ:

Благодаря первому ответу, используя Getch из http://code.activestate.com/recipes/134892/

getch = _Getch()
word=""
while True:
    c=getch.impl()
    if c=="a":
        word+="z"
    elif ord(c)==127: #backspace
        word=word[:-1]
    else:
        word+=c
    print word

Этого хватит, пока спасибо. Как только я доволен доработкой, я посмотрю на что-то более низкое, специфичное для операционной системы без python.

Одна проблема с getch, однако, заключается в том, что ctrl + a нельзя различить между ctrl + A (например, если вы удерживаете Ctrl и нажимаете клавиши, он не может определить разницу между прописными и строчными буквами)

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

Если все нормально, зависит от системы X Window, вы можете использовать модуль python-xlib или xpyb для доступа к системе X Window и использования XGrabKey вызов для захвата связанных с клавиатурой событий. После каждого события KeyPress вы сможете распечатать нажатую клавишу.

Теперь, если вы действительно хотите написать раскладку клавиш, это полностью зависит от ОС / оконной системы. Если вы используете систему X Window (Ubuntu делает), вам нужно проверить документацию X о том, как написать новую таблицу ключей. В Ubuntu текущее определение раскладок должно быть в /usr/share/X11/xkb. Посмотрите и попробуйте скопировать и отредактировать один. Вы можете использовать setxkbmap для изменения текущей раскладки клавиатуры.

1 голос
/ 27 мая 2011

Чтобы изменить раскладку клавиатуры на вашей клавиатуре, вы должны использовать инструменты, предоставляемые вашей ОС. Большинство приложений не принимают сгенерированные события по соображениям безопасности.

В вашем случае это будет xmodmap. Не забудьте создать резервную копию вашей текущей раскладки клавиатуры, используя опцию -pke, потому что вы допустите ошибку - и тогда ваша клавиатура больше не будет работать.

Если вы также хотите, чтобы ваша новая раскладка клавиатуры работала на консоли, взгляните на пакет kbd , который меняет раскладку клавиатуры на уровне ядра.

1 голос
/ 27 мая 2011

См. Этот вопрос StackOverflow: Python читает один символ от пользователя

Ответ с самым высоким рейтингом имел эту ссылку: http://code.activestate.com/recipes/134892/

...