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

Sea*_*vis 5 python gtk application-development gtk3

我想知道是否有人知道如何检测当前是否使用 Gtk 或 Gdk 和 python 按下了某个键?我不想在这种情况下使用 key-pressed 或 key-released 事件,而是检查它当前是否在应用程序启动时被按下。

具体来说,这是我希望我的应用程序执行的操作:

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

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

希望最好,

肖恩

TLE*_*TLE 3

假设您正在谈论一个普通按钮(假设为切换按钮),您可以在此处看到它具有的所有方法。当我读到它时,似乎没有您正在寻找的功能,可能是因为这些东西被设计为事件驱动的。

无论如何,我想知道,你不能让事件设置一个布尔值并查看它是否被按下。否则,也许你可以解释为什么绕过这些事件对你来说很重要。

编辑

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

当程序运行时,它会创建一个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()
Run Code Online (Sandbox Code Playgroud)


sda*_*aau 0

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

\n\n\n\n

它是从 C 编译为共享对象库.so,并且具有 Python 接口:

\n\n
python -c \'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))\' | less\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n