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

5 回答 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()

为我工作...

于 2009-02-05T13:12:09.947 回答
1

您正在做的是以/dev/tty“原始”模式阅读。

正常的 Linux 输入是“熟的”——退格和换行符已经为您处理好了。

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

查看http://code.activestate.com/recipes/68397/以获取有关这方面的一些指导。是的,配方在 tcl 中,但它会提示您如何进行。

于 2009-02-05T13:26:15.783 回答
1

好吧,事实证明,使用 GNOME 时有一个更简单的答案,它根本不涉及任何编程......

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

存档于 Wayback

只需创建要由组合键触发的脚本/可执行文件,并将您在 gconf-editor 中创建的“keybinding_commands”条目指向它。

为什么我没有早点想到呢?

于 2009-02-05T14:16:27.353 回答
1

或者(非 Python 选项)使用XBindKeys

于 2010-01-12T11:14:22.083 回答
0

tkinter 'bind' 方法仅在 tkinter 窗口处于活动状态时才有效。

如果您想要在所有桌面上工作的绑定击键组合(全局键/鼠标绑定),您可以使用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()
于 2019-11-22T11:39:19.357 回答