私はPython + GtkでUbuntu App Showdownのアプリケーションをすばやく作成しています。私はそれをDiscvurと呼んでいます。キーボードショートカットをいくつか追加したかったのですが。
ウェブを検索、私が見つかりました。AccelGroupについては、このページをしてgtk_widget_add_acceleratorについては、このページが、私はそれを起動する方法を理解していません。適切な信号をどのように定義し、それをアプリケーションで使用するかを教えてください。
私はPython + GtkでUbuntu App Showdownのアプリケーションをすばやく作成しています。私はそれをDiscvurと呼んでいます。キーボードショートカットをいくつか追加したかったのですが。
ウェブを検索、私が見つかりました。AccelGroupについては、このページをしてgtk_widget_add_acceleratorについては、このページが、私はそれを起動する方法を理解していません。適切な信号をどのように定義し、それをアプリケーションで使用するかを教えてください。
回答:
これは私の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を意味しますか、それともタイプミスですか?
これが最終的に機能したコードです。それは私の開発環境に大きく依存しているため、迅速に+ 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。」と出力されます。
このスレッドの特定の回答をスタンドアロンの例に再パッケージ化しました。
#!/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
場合、ボタンは押し下げられますが、アクセルは視覚的押し下げが終了した後にのみ押すことができます。