Я быстро создаю приложение для Ubuntu App Showdown в Python + Gtk. Я называю это Discvur. Я хотел бы включить некоторые сочетания клавиш.
В Интернете я нашел эту страницу о AccelGroup и эту страницу о gtk_widget_add_accelerator , но я не понимаю, с чего начать. Не могли бы вы рассказать мне, как бы я определил соответствующий сигнал, а затем использовал бы его в своем приложении?
Вот некоторые фрагменты кода из одного из моих приложений Python + Gtk, дополнительно дополненные комментариями к этому ответу:
Вот код, который наконец заработал. Поскольку это сильно зависит от моей среды разработки 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 я создал GtkEntry с именем «entry1» в моем окне с именем «discvur_window». На вкладке «Сигналы» я дал сигналу «backspace» обработчик под названием «on_erasing».
Теперь, нажав Backspace kbd> или Ctrl kbd> + B kbd>, выведите терминал «Он работает».
Я переупаковал данные ответы в этой теме в отдельный пример:
#!/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
blockquote>Примечание: Сигнал по умолчанию -
clicked
, а неactivate
, поскольку Приложения никогда не должны подключаться к сигналу::activate
, но используйте сигнал Gtk.Button::clicked
.