简体   繁体   中英

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?)

eg press d -> "z" prints to the screen using key layout1

eg 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:

  • a way to read keypresses instantly
  • a way to print key presses instantly (to the terminal or a GUI or whatever is easiest initially, if it worked on any editor that would be cool!)

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 (eg if you hold ctrl and press keys, it can't tell the difference between upper and lower case)

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.

See this StackOverflow question: Python read a single character from the user

The highest rated answer had this link: http://code.activestate.com/recipes/134892/

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM