如何在我正在开发的 Gtk 应用程序中创建和使用键盘快捷键?

如何在我正在开发的 Gtk 应用程序中创建和使用键盘快捷键?

我正在用 Python + Gtk 快速为 Ubuntu App Showdown 创建一个应用程序。我将其命名为 Discvur。我本来想包含一些键盘快捷键。

在网上搜索,我发现关于 AccelGroup 的此页面本页面关于 gtk_widget_add_accelerator但我不知道该如何开始。您能告诉我如何定义适当的信号,然后在我的应用程序中使用它吗?

答案1

下面是我的一个 Python + Gtk 应用程序中的一些代码,根据这个答案的评论进一步扩展:

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)

答案2

这是最终有效的代码。由于它高度依赖于我的开发环境 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。在“信号”选项卡中,我为信号“backspace”提供了一个名为“on_erasing”的处理程序。

现在,按下BackspaceCtrl+B可以让终端打印“It works。”。

答案3

我已将此线程中给出的答案重新打包为一个独立示例:

#!/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信号。

相关内容