1

Python-keybinder 用于在我的程序中设置全局热键。GtkToggleButton 小部件用于从用户检索键绑定(key-press-event/key-release-event)。

用户按下切换按钮并按下一些键(左 Control + t,fe)。Togglebutton 的事件(按键事件)返回“Control_L”和“t”。程序将其保存到字符串“t”中并调用 keybinder.bind("t", callback)。用户按下该热键并且......没有任何反应。经过一段时间的挖掘,我发现了奇怪的事情 - keybinder 理解“Control”(没有 _L/_R)、“Alt”等,但不理解“Control_L”、“Alt_L”......文档接下来说:

python-keybinder 文档中的文本:

bind(...)
    bind (keystring, callback, user_data) -> bool

    Keystring should be in the format understood by
    gtk.accelerator_parse. An example is '<Ctrl>space'.

来自 gtk/gtkaccelgroup.c 的文本:

  • gtk_accelerator_parse: *
  • 解析表示加速器的字符串。这
  • 格式看起来像 "<Control>a" 或 "<Shift><Alt>F1" 或
  • “<Release>z”(最后一个用于释放键)。
  • 解析器相当自由,允许小写或大写,
  • 以及诸如“<Ctl>”和“<Ctrl>”之类的缩写。
  • 使用 gdk_keyval_from_name() 解析键名。

来自 gdk/gdkkeynames.c 的文本:

  • gdk_keyval_from_name:*
  • 将键名转换为键值。*
  • 名字和里面的一样
  • <gdk/gdkkeysyms.h> 头文件
  • 但没有领先的“GDK_KEY_”。

好的,最后来自 gdk/gdkkeysyms.h 的文本:

205 #define GDK_KEY_Control_L 0xffe3
206 #define GDK_KEY_Control_R 0xffe4

如何在不将“Control_L”替换为“Control”、“Alt_L”替换为“Alt”等的情况下设置和使用键盘绑定器?

更新:Linux、Python 2.4-2.7

Upd2:我想看看“左控制”和“右控制”之间的区别,并将这些键用作不同的按钮。我怎样才能用 gtk.accelerator_parse() 做到这一点?有办法吗?

谢谢。

4

2 回答 2

2

只是为了在接受的答案中添加一个示例,这里是 python 代码解决了我的问题:

>>> import gtk
>>> gtk.accelerator_name(ord(';'),gtk.gdk.MOD1_MASK)
'<Alt>semicolon'

函数文档位于http://www.pygtk.org/pygtk2reference/class-gtkaccelgroup.html#function-gtk--accelerator-name

修饰符常量位于: http: //www.pygtk.org/pygtk2reference/gdk-constants.html#gdk-modifier-constants

于 2014-12-29T15:49:20.113 回答
2

GTK 提供GtkCellRendererAccel用于设置键绑定,这可能更容易,因为您不必担心在两种键描述格式之间进行转换。

于 2013-07-09T09:40:18.250 回答