Sea*_*vis 5 python gtk application-development gtk3
我想知道是否有人知道如何检测当前是否使用 Gtk 或 Gdk 和 python 按下了某个键?我不想在这种情况下使用 key-pressed 或 key-released 事件,而是检查它当前是否在应用程序启动时被按下。
具体来说,这是我希望我的应用程序执行的操作:
这类似于 Unity 键盘快捷键覆盖中看到的功能,其中您按住 SUPER 键 2 秒钟并显示窗口。如果有更好的方法来做到这一点(最好不要让程序在后台运行并等待),那也是可以接受的。
希望最好,
肖恩
假设您正在谈论一个普通按钮(假设为切换按钮),您可以在此处看到它具有的所有方法。当我读到它时,似乎没有您正在寻找的功能,可能是因为这些东西被设计为事件驱动的。
无论如何,我想知道,你不能让事件设置一个布尔值并查看它是否被按下。否则,也许你可以解释为什么绕过这些事件对你来说很重要。
编辑
在意识到我误读了您的原始帖子并且您正在谈论键盘按键而不是按钮后,我提出了以下建议。
当程序运行时,它会创建一个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)
我只是在这里添加一个注释;我刚刚了解到这个keybinder
库,它显然是从 Tomboy 笔记中分离出来的(尽管它是 Gtk2,而且我刚刚看到了标签 Gtk3):
它是从 C 编译为共享对象库.so
,并且具有 Python 接口:
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 归档时间: |
|
查看次数: |
2774 次 |
最近记录: |