python-keybinder和右键热键

时间:2013-07-08 13:54:13

标签: python gtk pygtk

Python-keybinder用于在我的程序中设置全局热键。 GtkToggleButton小部件用于从用户检索键绑定(按键事件/键释放事件)。

用户按下togglebutton并按下某些键(Left Control + t,f.e。)。 Togglebutton的事件(按键事件)返回“Control_L”和“t”。程序将其保存到字符串“t”并调用keybinder.bind(“t”,回调)。用户按下该热键并且......没有任何反应。经过一段时间的挖掘后我发现奇怪的事情 - 键控器理解“控制”(没有_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: *
  • 解析代表加速器的字符串。在
  • 格式看起来像“&lt; Control&gt; a”或“&lt; Shift&gt;&lt; Alt&gt; F1”或
  • “&lt; Release&gt; z”(最后一个用于密钥发布)。
  • 解析器相当宽松,允许使用大写或小写,
  • 以及诸如“&lt; Ctl&gt;”的缩写。和“&lt; Ctrl&gt;”。
  • 使用gdk_keyval_from_name()。
  • 解析密钥名称

来自gdk / gdkkeynames.c的文字:

  • gdk_keyval_from_name: *
  • 将键名转换为键值。 *
  • 名称与
  • 中的名称相同
  • &LT; GDK / gdkkeysyms.h&GT;头文件
  • 但没有领先的“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”等的情况下设置和使用键盘?

Upd:Linux,Python 2.4-2.7

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

日Thnx。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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