Ubuntu App ShowdownのアプリケーションをPython + Gtkですばやく作成しています。私はそれをDiscvurと呼んでいます。キーボードショートカットをいくつか追加したいと思いました。
Webを検索すると、 AccelGroupについてのこのページ および gtk_widget_add_acceleratorについてのこのページ が見つかりましたが、それから始める方法がわかりません。適切な信号を定義し、それをアプリケーションで使用する方法を教えてください。
これが最終的に機能したコードです。開発環境Quickly + Glade + Python + Gtkに大きく依存するため、独立した回答にします。 ブライスの答え が大いに役立ったので、 aking1012 とのやり取りも助けました。
テキストエディターの実際のコード:
# Accelerators
self.my_accelerators = Gtk.AccelGroup()
self.window = self.builder.get_object("discvur_window")
self.window.add_accel_group(self.my_accelerators)
self.entry = self.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")
…
def add_accelerator(self, widget, accelerator, signal="activate"):
"""Adds a keyboard shortcut"""
if accelerator is not None:
#if DEBUG:
#print accelerator, widget.get_tooltip_text()
key, mod = Gtk.accelerator_parse(accelerator)
widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
print "The accelerator is well added with the signal " + signal
def on_erasing(self, widget):
print "It works."
Gladeでは、「discvur_window」というウィンドウに「entry1」というGtkEntryを作成しました。 「Signals」タブで、シグナル「backspace」に「on_erasing」というハンドラーを指定しました。
今、打つ Backspace または Ctrl+B 端末に「It works。」と表示させます。
これは、私のPython + Gtkアプリの1つからのコードの一部です。この回答へのコメントに従ってさらに拡張されています。
self.my_accelerators = Gtk.AccelGroup()
self.entry = Gtk.builder.get_object("entry1")
self.add_accelerator(self.entry, "<Control>b", signal="backspace")
...
def add_accelerator(self, widget, accelerator, signal="activate"):
"""Adds a keyboard shortcut"""
if accelerator is not None:
#if DEBUG:
#print accelerator, widget.get_tooltip_text()
key, mod = Gtk.accelerator_parse(accelerator)
widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
このスレッドの特定の回答をスタンドアロンの例に再パッケージ化しました。
#!/usr/bin/env python2
import signal
from gi.repository import Gtk
def bind_accelerator(accelerators, widget, accelerator, signal='clicked'):
key, mod = Gtk.accelerator_parse(accelerator)
widget.add_accelerator(signal, accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
def on_recompute_base_encryption_key_hash(widget):
print 'Thinking... (This could take forever)'
def main():
if 'gtk':
window = Gtk.Window()
window.connect("delete-event", Gtk.main_quit)
if 'accelerator-demo':
# Accelerators
accelerators = Gtk.AccelGroup()
window.add_accel_group(accelerators)
# Widget
target_widget = Gtk.Button('Recompute Base Encryption Key Hash')
target_widget.connect('clicked', on_recompute_base_encryption_key_hash)
window.add(target_widget)
# Bind
bind_accelerator(accelerators, target_widget, '<Control>b')
window.show_all()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
if __== '__main__':
main()
Gistとしても利用可能: https://Gist.github.com/thorsummoner/230bed5bbd3380bd5949
注:デフォルトの信号はclicked
ではなくactivate
です。これは アプリケーションは::activate
信号ですが、Gtk.Button ::clicked
信号を使用します。