在Linux上用Python检测按键组合?

5
我希望捕获按键,以便在按下给定组合键时触发事件。
我已经搜索了一些入门提示,我找到的最简单的代码段在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()
5个回答

3
Tk似乎无法识别窗口未显示的情况。尝试以下方法:
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()

对我来说很有效...


嗯,这个可以 - 谢谢 - 但我不想显示窗口。我想要一个后台进程,等待组合键的触发。 - Ben L
很抱歉,我不知道你如何实现这一点,但至少你有一个新的研究方向。 - Ulf

1

或者(一种非Python选项)使用XBindKeys


1

你正在以“原始”模式读取/dev/tty

正常的Linux输入是“熟练”的 - 退格和行结束已经为您处理好了。

要以“原始”模式读取类似键盘的设备,您需要直接调用Linux API来进行IOCTL。

请参考http://code.activestate.com/recipes/68397/获取一些指导。是的,这个示例是用tcl编写的,但它可以给您提供如何继续的提示。


1

0

当 tkinter 窗口处于活动状态时,'bind' 方法才能正常工作。

如果您想要绑定在所有桌面上都有效的按键组合(全局键/鼠标绑定),您可以使用 bindglobal(使用 pip install bindglobal 安装)。它的工作方式与标准的 tkinter 'bind' 完全相同。

示例代码:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接