2013-07-08 21 views
1

Python-keybinder用於在我的程序中設置全局熱鍵。 GtkToggleButton小部件用於檢索用戶的按鍵綁定(按鍵事件/按鍵釋放事件)。python-keybinder和右熱鍵字符串

用戶按下togglebutton並按下一些鍵(Left Control + t,f.e.)。 Togglebutton的事件(按鍵事件)返回「Control_L」和「t」。程序將其保存爲字符串「t」並調用keybinder.bind(「t」,callback)。用戶按下該熱鍵,......沒有任何反應。我經過一段時間的挖掘發現奇怪的事情 - keybinder瞭解「控制」(沒有_L/_R),「Alt」等,並不理解「Control_L」,「Alt_L」... 文檔說下一個:

從蟒-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: *
  • 解析表示加速器的字符串。該
  • 格式看起來像 「<控制>一」 或 「<移> < Alt鍵> F1」 或
  • 「<發佈> 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 

如何設置和使用keybinder無需更換 「Control_L」 向 「控制」, 「Alt_L」 到 「ALT」等等?

UPD:Linux的,Python的2.4-2.7

UPD2:我想看看「左側控制」和「控制權」之間的區別,並使用這些按鍵爲不同的按鈕。我怎樣才能用gtk.accelerator_parse()來做到這一點?有沒有辦法?

Thnx。

回答

2

GTK提供GtkCellRendererAccel設置鍵綁定,這可能會更容易,因爲您不必擔心在兩種關鍵描述格式之間轉換。

+0

當窗口打開並處於活動狀態時,我已經在窗口上使用GtkCellRendererAccel作爲窗口小部件,但大部分時間窗口處於非活動狀態並且不可見。全球熱鍵(也許「系統熱鍵」將更加正確)是這些時刻所需要的。據我所知,GtkCellRendererAccel不能分配全局熱鍵,但也許我錯了。你能展示一個非常小的例子,或者鏈接到例子/更精確的文檔嗎? –

+0

對不起,我第一次想念你的問題。 GtkCellRendererAccel將爲您顯示熱鍵,併爲用戶提供一個很好的界面來設置它們。要將keyval和修飾符屬性轉換爲[gtk.accelerator_parse](https://developer.gnome.org/pygtk/stable/class-gtkaccelgroup.html#function-gtk--accelerator-parse)的字符串,您需要致電[gtk.accelerator_name](https://developer.gnome.org/pygtk/stable/class-gtkaccelgroup.html#function-gtk--accelerator-name)。如果您堅持使用切換按鈕,則需要針對gtk.accelerator_get_default_mod_mask()屏蔽修飾符。 –

+0

恩,是的。 gtk.accelerator_name()返回字符串與所有按下的鍵(修飾符和鍵),但我想看到「左控制」和「右控制」之間的區別,並使用這些鍵作爲不同的按鈕,而不是相同(只是「控制」 )。正如我之前寫的,Gtk必須明白Control_L和Control_R是不同的鍵,但gtk.accelerator_parse()不理解,即使我將mod掩碼設置爲gtk.gdk.MODIFIER_MASK(允許所有修飾符)。 –