gi.repository.Gdk 中的 KEY.is_pressed()?

gi.repository.Gdk 中的 KEY.is_pressed()?

我想知道是否有人知道如何使用 Gtk 或 Gdk 和 python 检测当前是否按下了某个键?对于这种情况,我不想使用按键按下或按键释放事件,而是检查应用程序启动时是否按下了该键。

具体来说,我希望我的应用程序能够执行以下操作:

  1. 通过键盘快捷键开始打开。
  2. 等待2秒。
  3. 如果 2 秒后仍按住键盘快捷键,则显示窗口。
  4. 如果在 2 秒计时器的任何时候释放了键盘快捷键,则不要显示窗口并退出。

这类似于 Unity 键盘快捷键覆盖中的功能,按住 SUPER 键 2 秒钟即可显示窗口。如果有更好的方法可以做到这一点(最好是程序不需要在后台运行并等待),那也是可以接受的。

希望一切顺利,

肖恩

答案1

假设你正在谈论一个普通按钮(就像一个切换按钮),你可以看到这里提供的所有方法。据我所知,似乎没有您要寻找的功能,可能是因为这些东西被设计为事件驱动的。

无论如何,我想知道,您不能只让事件设置布尔值并查看它是否被按下吗?否则,也许您可​​以解释为什么绕过事件对您很重要。

编辑

在意识到我误读了您的原始帖子并且您谈论的是键盘键而不是按钮后,我提出了以下建议。

当程序运行时,它将创建一个 gtk 窗口并隐藏它,以便能够监听键盘事件。然后它将监听键发布启动程序的快捷键中的任何键(本例中为 ctrl-alt-u)都会触发事件。如果在启动超时时间内释放了其中任何一个键,程序就会在超时结束时退出,否则,程序会显示该程序。

如果您想延迟程序代码的实际启动以节省资源,您当然可以只使用虚拟窗口,而不在函数中加载真实窗口或任何底层类start_or_not

import pygtk
pygtk.require('2.0')
import gtk

class DelayedStart:

    def __init__(self):
        self.w = gtk.Window()
        self.w.connect('destroy', gtk.main_quit)
        # Connect key released events to a function
        self.w.connect('key_release_event', self.on_key_press_event)
        self.w.show_all()
        # Hide the window, we actually need a gtk window to listen for
        # keyboard events, so we just hide it
        self.w.set_decorated(False)
        self.w.set_opacity(0)

        self.show_on_timeout = True
        # Ask gtk to call the this function in 2 seconds
        gtk.timeout_add(1000*2, self.start_or_not)
        gtk.main()

    def on_key_press_event(self, widget, event):
        """ Check if any of the key in the shortcut ctrl-alt-u is released """
        # ctrl = 65507, alt = 65513, u = 117
        keys = [65507, 65513, 117]
        if event.keyval in keys:
            self.show_on_timeout = False

    def start_or_not(self):
        """ Check if the program should be started or not """
        if self.show_on_timeout:
            self.w.set_decorated(True)
            self.w.set_opacity(1)
        else:
            gtk.main_quit()
        # Returning false will destroy the timer, we only want to run this once
        return False

if __name__ == "__main__":
    DELAYED_START = DelayedStart()

答案2

我只在这里添加一条注释;我刚刚了解了这个keybinder库,它显然是从 Tomboy 注释中分离出来的(虽然它是 Gtk2,但我刚刚看到标签 Gtk3):

它是从 C 编译而来的一个共享对象库.so,并且有一个 Python 接口:

python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less

查看源代码keybinder/libkeybinder at master · engla/keybinder · GitHub; 我可以看到,即使在 C 级别,实现也是通过注册按键事件来实现的 - 并且没有任何东西(在我看来)保存键盘按键的实际按下状态。这可能意味着,不幸的是,没有一个工具(函数、数组)可以随时查找任何按键的按下状态。

相关内容