Detect key press combination in Linux with Python?

a 夏天 提交于 2020-01-03 18:56:30

问题


I'm trying to capture key presses so that when a given combination is pressed I trigger an event.

I've searched around for tips on how to get started and the simplest code snippet I can find is in Python - I grabbed the code below for it from here. However, when I run this from a terminal and hit some keys, after the "Press a key..." statement nothing happens.

Am I being stupid? Can anyone explain why nothing happens, or suggest a better way of achieving this on Linux (any language considered!)?

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:


Tk does not seem to get it if you do not display the window. Try:

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

works for me...




回答2:


What you're doing is reading /dev/tty in "raw" mode.

Normal Linux input is "cooked" -- backspaces and line endings have been handled for you.

To read a device like your keyboard in "raw" mode, you need to make direct Linux API calls to IOCTL.

Look at http://code.activestate.com/recipes/68397/ for some guidance on this. Yes, the recipe is in tcl, but it gives you a hint as to how to proceed.




回答3:


Alternatively (a non-Python option) use XBindKeys.




回答4:


Well, turns out there is a much simpler answer when using GNOME which doesn't involve any programming at all...

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

Archived on Wayback

Just create the script/executable to be triggered by the key combination and point the 'keybinding_commands' entry you create in gconf-editor at it.

Why didn't I think of that earlier?




回答5:


tkinter 'bind' method only works when tkinter window is active.

If you want binding keystrokes combinations that works in all desktop (global key/mouse binding) you can use bindglobal (install with pip install bindglobal). It works exactly like standard tkinter 'bind'.

Example code:

import bindglobal
def callback(e):
    print("CALLBACK event=" + str(e))

bg = BindGlobal()
bg.gbind("<Menu-1>",callback)
bg.start()


来源:https://stackoverflow.com/questions/515801/detect-key-press-combination-in-linux-with-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!