Rusty Rob
Rusty Rob

Reputation: 17173

printing key presses to the screen instantly with python

I know this question is long but what I really want to know is in bold.

I would prefer to use python on Linux.

I'm trying to make a new keyboard layout kind of like devorak but the layout is set to either layout1 or layout2 depending on if you are holding a hot key or not (the hot key should probably be ctrl?)

e.g. press d -> "z" prints to the screen using key layout1

e.g. press ctrl d -> "x" prints to the screen using key layout2

My main problem (and question that needs answering) is the way characters need to print to the screen.

if someone presses the keys (in this order) "(a)(b)(c)(d)(ctrl+d)(shift+e=E)(f)(Enter)"

now lets say the output for these key presses should be "oijzxKb" I don't want output to render with new lines:

o
i
j
z
x
K
b

I want the characters to appear instantly on the screen as each character is pressed (without waiting for them to press enter).

e.g.
press o

Screenshot1 o

press i

Screenshot2 oi

press j

Screenshot3 oij

.. etc

I assume I will need the following:

I could probably do this in PyGame (but then I probably wouldn't be able to cut and paste etc) and I'm guessing there should be an easier way.

I'm using a Logitech G110 keyboard, I may eventually want to use this as an alternative to my qwerty keyboard on all my applications across all my devices.

Thanks!

EDIT: SOLUTION:

Thanks to the first response, using Getch from 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

This will suffice for now thank you. Once I'm happy with refinement I'll look at doing something lower level, operating system specific without python.

One problem with getch however is that ctrl+a cant be distinguished between ctrl+A (e.g. if you hold ctrl and press keys, it can't tell the difference between upper and lower case)

Upvotes: 0

Views: 7061

Answers (2)

Aaron Digulla
Aaron Digulla

Reputation: 328594

To modify the key mapping of your keyboard, you must use the tools provided by your OS. Most applications don't accept generated events for security reasons.

In your case, that would be xmodmap. Don't forget to create a backup of your current keymap using the -pke option because you will make a mistake - and then, your keyboard won't be working anymore.

If you also want your new keymap work on the console, have a look at the kbd package which changes the keyboard layout at the kernel level.

Upvotes: 1

jd_
jd_

Reputation: 510

If it's ok to depends on the X window system, you can use the python-xlib module or the xpyb module to access the X window system and use a XGrabKey call to grab the keyboard related events. Upon each KeyPress event you will be able to print the pressed key.

Now, if you really want to write a keymap, this is totally OS/window system dependent. If you use the X window system (Ubuntu does), you need to check the X documentation about how to write a new keymap. On Ubuntu, the current keymaps definition should be in /usr/share/X11/xkb. Take a look, and try to copy and edit one. You can use setxkbmap to change the current keymap then.

Upvotes: 3

Related Questions