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


9

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

ウェブを検索、私が見つかりました。AccelGroupについては、このページをしてgtk_widget_add_acceleratorについては、このページが、私はそれを起動する方法を理解していません。適切な信号をどのように定義し、それをアプリケーションで使用するかを教えてください。


最初のリンクが壊れています...
WinEunuuchs2Unix

回答:


8

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

ありがとうございますself.add_accelerator(self.quick_add_entry, "<Control>l", signal="grab-focus") AttributeError: 'DiscvurWindow' object has no attribute 'quick_add_entry'。次のエラーが発生しました:。「quick_add_entry」のウェブ検索を行ったところ、どこにも見つかりません。それは正しい機能ですか?これに関する詳細情報/チュートリアルはどこにありますか?さらに、「<Control> l」はCtrl + lを意味しますか、それともタイプミスですか?
Agmenor 2012年

これは関数ではなく、アクセラレータを接続しているウィジェットの名前です。より明確になるように修正しました。
ブライス

お返事ありがとうございます。まず、「gtk」を「Gtk」に自由に変更しました。次に、コードを実行すると、「NameError:グローバル名 'DEBUG'が定義されていません」と表示されるため、これは独自のスクリプトの変数であると考えます。だから私は自分のスクリプトでそれをコメントしました。3番目に、コメントした後、「AttributeError: 'DiscvurWindow' object has no attribute 'accelerators'」というエラーが表示されます。これが明らかであるとすれば申し訳ありませんが、ドキュメントはまだわかりません。特に、ドキュメントにはadd_acceleratorには6つの引数が必要と書かれていますか?
Agmenor

右、アクセラレータを自分で作成する必要があります。方法を示すために例を更新しました。
ブライス

少し調べてみて失敗しましたが、動作するスクリプトを取得できました。確認していただけませんか?正しいと思われる場合は、私が答えを変更します(または変更できます)。paste.ubuntu.com / 1053516。ブライス、たくさんのレビューをお願いします。「ちょっとした研究」とは婉曲表現でしたが、魚を与えるよりも、釣りの仕方を学んだ方がいいと思います。もう一度ありがとうございます。
Agmenor 2012年

6

これが最終的に機能したコードです。それは私の開発環境に大きく依存しているため、迅速に+ 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を作成しました。「シグナル」タブで、シグナル「バックスペース」に「on_erasing」というハンドラーを指定しました。

ここで、BackspaceまたはCtrl+をB押すと、端末に「It works。」と出力されます。


これを使用して、Ctrl + F4ショートカットを無効にしてウィンドウを閉じることができますか?
Juzer Ali

Alt + F4ですか?わからない、試したことはない。
Agmenor 2012

私はCtrl + F4とAlt + F4の両方を意味しました
Juzer Ali

2

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

#!/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 __name__ == '__main__':
    main()

要旨としても利用可能:https : //gist.github.com/thorsummoner/230bed5bbd3380bd5949

注:デフォルトの信号はですこれはclickedアプリケーションが信号に接続してはならないactivateためではなく::activate、Gtk.Button ::clicked信号を使用するためです。


それで私は気づきました。clickedアクセラレータを使用すると、非常にすばやくマッシュできますが、ボタンは視覚的に押し下げられません。を使用するactivate場合、ボタンは押し下げられますが、アクセルは視覚的押し下げが終了した後にのみ押すことができます。
ThorSummoner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.