Python GTK3 工具栏加速器不起作用

Arr*_*rry 5 python gtk3

我正在遵循Python GTK+ 3 教程,但我为工具栏操作设置的加速器不起作用。这是一个显示问题的程序,大致基于该教程。有一个带N快捷方式的菜单操作和一个带快捷方式的工具栏操作X。菜单操作的快捷方式有效,工具栏操作的快捷方式无效,即使操作的创建方式相同。

from gi.repository import Gtk

UI_INFO = """
<ui>
  <menubar name='TestMenubar'>
    <menu action='FileMenu'>
      <menuitem action='MenuAction' />
    </menu>
  </menubar>
  <toolbar name='TestToolbar'>
    <toolitem action='ToolbarAction' />
  </toolbar>
</ui>
"""

class MyWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Test")

        self.set_default_size(200, 100)

        action_group = Gtk.ActionGroup(name="test_actions")

        self.add_menu_action(action_group)
        self.add_toolbar_action(action_group)

        uimanager = self.create_ui_manager()
        uimanager.insert_action_group(action_group)

        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)

        menubar = uimanager.get_widget("/TestMenubar")
        box.pack_start(menubar, False, False, 0)

        toolbar = uimanager.get_widget("/TestToolbar")
        box.pack_start(toolbar, False, False, 0)

        self.add(box)

    def add_menu_action(self, action_group):
        action_filemenu = Gtk.Action(name="FileMenu", label="File")
        action_group.add_action(action_filemenu)


        action = Gtk.Action(name='MenuAction',
                            label="Menu action",
                            stock_id=Gtk.STOCK_NEW)
        action.connect('activate', self.on_menu_action)
        action_group.add_action_with_accel(action, 'N')

    def add_toolbar_action(self, action_group):
        action = Gtk.Action(name='ToolbarAction',
                            label="Press me",
                            stock_id=Gtk.STOCK_MEDIA_STOP)
        action.connect('activate', self.on_toolbar_action)
        action_group.add_action_with_accel(action, 'X')

    def on_menu_action(self, widget):
        print 'Menu action'

    def on_toolbar_action(self, widget):
        print 'Toolbar action'

    def create_ui_manager(self):
        uimanager = Gtk.UIManager()

        uimanager.add_ui_from_string(UI_INFO)

        self.add_accel_group(uimanager.get_accel_group())

        return uimanager

window = MyWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)

如何让按下X快捷键调用回调?

GTK+ 3 的参考资料说它add_action_with_accel已被弃用,因此肯定有更好的方法来创建加速器,但文档没有显示方法,而且我找不到更好的教程。)

小智 1

面临同样的问题。我在此处针对特定于 gedit 插件的 gtk 3 编程提出了类似的问题。我发现菜单栏快捷方式是唯一有效的。因此,只需引入一个菜单项,该菜单项的功能与您的工具项的功能完全相同。保留您的工具项以便为用户提供灵活性,但不要为其分配任何快捷方式。即add_action,不足以add_action_with_accel将其添加到操作组中。