1

Python-keybinder を使用して、プログラムでグローバル ホットキーを設定します。GtkToggleButton ウィジェットは、ユーザーからキーバインディングを取得するために使用されます (key-press-event/key-release-event)。

ユーザーがトグルボタンを押し、いくつかのキーを押します (左コントロール + t、fe)。トグルボタンのイベント (key-press-event) は、"Control_L" と "t" を返します。プログラムはこれを文字列 "t" に保存し、keybinder.bind("t", callback) を呼び出します。ユーザーがそのホットキーを押しても...何も起こりません。しばらく掘り下げた後、奇妙なことがわかりました-キーバインダーは「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" (最後の 1 つはキー リリース用です)。
  • パーサーはかなりリベラルで、小文字または大文字を使用できます。
  • また、「<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を提供しています。これは、2 つのキー記述形式間の変換について心配する必要がないため、より簡単かもしれません。

于 2013-07-09T09:40:18.250 に答える