web-dev-qa-db-ja.com

開発中のGtkアプリでキーボードショートカットを作成して使用するにはどうすればよいですか?

Ubuntu App ShowdownのアプリケーションをPython + Gtkですばやく作成しています。私はそれをDiscvurと呼んでいます。キーボードショートカットをいくつか追加したいと思いました。

Webを検索すると、 AccelGroupについてのこのページ および gtk_widget_add_acceleratorについてのこのページ が見つかりましたが、それから始める方法がわかりません。適切な信号を定義し、それをアプリケーションで使用する方法を教えてください。

8
Agmenor

これが最終的に機能したコードです。開発環境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。」と表示させます。

6
Agmenor

これは、私の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)
8
Bryce

このスレッドの特定の回答をスタンドアロンの例に再パッケージ化しました。

#!/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信号を使用します。

2
ThorSummoner