Как создать и использовать сочетания клавиш в разрабатываемом приложении Gtk?

Я быстро создаю приложение для Ubuntu App Showdown в Python + Gtk. Я называю это Discvur. Я хотел бы включить некоторые сочетания клавиш.

В Интернете я нашел эту страницу о AccelGroup и эту страницу о gtk_widget_add_accelerator , но я не понимаю, с чего начать. Не могли бы вы рассказать мне, как бы я определил соответствующий сигнал, а затем использовал бы его в своем приложении?

8
задан 24 June 2012 в 01:32

3 ответа

Вот некоторые фрагменты кода из одного из моих приложений Python + Gtk, дополнительно дополненные комментариями к этому ответу:

0
ответ дан 24 June 2012 в 01:32

Вот код, который наконец заработал. Поскольку это сильно зависит от моей среды разработки 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 или Ctrl + B , выведите терминал «Он работает».

0
ответ дан 24 June 2012 в 01:32

Я переупаковал данные ответы в этой теме в отдельный пример:

#!/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.

0
ответ дан 24 June 2012 в 01:32

Другие вопросы по тегам:

Похожие вопросы: