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


9

我正在使用Python + Gtk快速为Ubuntu App Showdown创建应用程序。我称它为Discvur。我希望包括一些键盘快捷键。

在网上搜索时,我找到了有关AccelGroup的页面有关gtk_widget_add_accelerator的页面,但我不知道如何开始。您能告诉我如何定义适当的信号,然后在应用程序中使用它吗?


第一个链接断开了……
WinEunuuchs2Unix

Answers:


8

这是我的一个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)

谢谢,但出现此错误: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年

它不是函数,仅是您要连接加速器的任何小部件的名称。我已经对其进行了更清晰的修订。
布莱斯2012年

谢谢您的回答。首先,我自由地将“ gtk”更改为“ Gtk”。其次,当我运行您的代码时,我得到“ NameError:未定义全局名称'DEBUG'”,因此我想这是您自己脚本中的一个变量。所以我用自己的脚本发表了评论。第三,评论后,出现错误“ AttributeError:'DiscvurWindow'对象没有属性'accelerators'”。很抱歉,这应该是显而易见的,但是文档对我仍然很模糊;特别是文档说add_accelerator需要6个参数?
Agmenor 2012年

正确,您需要自己创建加速器;我已经更新了示例以显示操作方法。
布莱斯2012年

经过一些研究和失败的尝试,我可以获得一个有效的脚本。您能验证一下吗?如果您认为正确,我将(或您可以)修改您的答案:paste.ubuntu.com/1053516。布莱斯,非常感谢您的评论。“一点点研究”是一种委婉的说法,但我认为学习一个人如何钓鱼比给他一条鱼更好。所以再次谢谢你。
Agmenor 2012年

6

这是最终起作用的代码。由于它高度依赖于我的开发环境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中,我在窗口中创建了一个名为“ entry1”的GtkEntry,名为“ discvur_window”。在“信号”选项卡中,我给信号“退格”一个名为“ on_erasing”的处理程序。

现在,按BackspaceCtrl+ B将使终端打印“ It works”。


可以用来禁用Ctrl + F4快捷键来关闭窗口吗?
Juzer Ali 2012年

您的意思是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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.