【问题标题】:Detect key press combination in Linux with Python?用Python检测Linux中的按键组合?
【发布时间】:2009-02-05 13:03:36
【问题描述】:

我正在尝试捕获按键,以便在按下给定组合时触发事件。

我搜索了有关如何开始使用的提示,我能找到的最简单的代码 sn-p 是 Python 中的 - 我从 here 获取了下面的代码。但是,当我从终端运行它并按下一些键时,在“Press a key...”语句之后没有任何反应。

我是不是很傻?谁能解释为什么什么都没有发生,或者提出在 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()

【问题讨论】:

    标签: python linux keylogger


    【解决方案1】:

    如果您不显示窗口,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()
    

    为我工作...

    【讨论】:

    • 嗯,这行得通 - 谢谢 - 但我真的不想显示窗口。我的目标是拥有一个等待组合的后台进程。
    • 很抱歉,我不知道你是怎么做到的,但至少你有了进一步研究的新方向。
    【解决方案2】:

    你正在做的是在“原始”模式下阅读/dev/tty

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

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

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

    【讨论】:

      【解决方案3】:

      或者(非 Python 选项)使用 XBindKeys

      【讨论】:

        【解决方案4】:

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

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

        Archived on Wayback

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

        为什么我没有早点想到这一点?

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2020-02-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-30
            • 1970-01-01
            • 2021-04-06
            相关资源
            最近更新 更多