【问题标题】:How to create a complete menu using GIO Actions in PyGI GTK?如何在 PyGI GTK 中使用 GIO 操作创建完整的菜单?
【发布时间】:2013-10-29 04:09:07
【问题描述】:

我正在尝试在我的 Gtk 应用程序中转换菜单栏,以便它将使用 GActions(来自 Gio)而不是 Python3 中使用 GObject Instrospection 的 GtkActions。

我一直在尝试自己解决这个问题,但到目前为止它似乎非常复杂,而且我运气不佳。

如果有人可以发布一个示例,说明如何创建一个基于 GAction 的简单菜单

  • 子菜单
  • 带有股票 ID 图标/热键的菜单项
  • 带有非库存图标/热键的菜单项
  • 选中的菜单项
  • 和单选菜单项组
  • 禁用(灰显)的菜单项

这对我真的很有帮助。

编辑:这是我现在窗口中的菜单栏:

如果有人可以复制使用 GioActions 显示的菜单项,那么我可以弄清楚它们是如何工作的,那就太好了。

顺便说一句,我使用的所有操作都使用窗口回调而不是应用回调,所以这是一个窗口菜单栏而不是应用菜单栏。

【问题讨论】:

    标签: python python-3.x gtk gtk3 pygobject


    【解决方案1】:

    现在添加了一个菜单栏。

    #!/usr/bin/env python3
    
    # Copyright (C) 2013 LiuLang <gsushzhsosgsu@gmail.com>
    
    # Use of this source code is governed by GPLv3 license that can be found
    # in http://www.gnu.org/licenses/gpl-3.0.html
    
    from gi.repository import Gio
    from gi.repository import Gtk
    import sys
    
    menus_str ='''
    <?xml version="1.0"?>
    <interface>
      <menu id="appmenu">
        <section>
          <item>
            <attribute name="label" translatable="yes">Preferences</attribute>
            <attribute name="action">app.preferences</attribute>
          </item>
        </section>
        <section>
          <item>
            <attribute name="label" translatable="yes">About</attribute>
            <attribute name="action">app.about</attribute>
          </item>
          <item>
            <attribute name="label" translatable="yes">Quit</attribute>
            <attribute name="action">app.quit</attribute>
            <attribute name="accel">&lt;Primary&gt;q</attribute>
          </item>
        </section>
      </menu>
      <menu id="menubar">
        <submenu>
          <attribute name="label">_Help</attribute>
          <section>
            <item>
                  <attribute name="label">_About</attribute>
                  <attribute name="action">app.about</attribute>
                </item>
              </section>
            </submenu>
          </menu>
        </interface>
        '''
    
        class App:
            def __init__(self):
                self.app = Gtk.Application.new('org.liulang.test', 0)
                self.app.connect('startup', self.on_app_startup)
                self.app.connect('activate', self.on_app_activate)
                self.app.connect('shutdown', self.on_app_shutdown)
    
            def run(self, argv):
                self.app.run(argv)
    
            def on_app_startup(self, app):
                self.window = Gtk.ApplicationWindow.new(app)
                self.window.set_default_size(640, 480)
                self.window.set_title('Gio Actions Demo')
                self.window.set_border_width(5)
                # no need to connect delete-event/destroy signal
    
                app.add_window(self.window)
    
                label = Gtk.Label('Hello, Gtk3')
                self.window.add(label)
                label.props.halign = Gtk.Align.CENTER
                label.props.valign = Gtk.Align.CENTER
    
                builder = Gtk.Builder()
                # It is better to load ui from a seperate file
                builder.add_from_string(menus_str)
                builder.connect_signals(self)
                appmenu = builder.get_object('appmenu')
                app.set_app_menu(appmenu)
                menubar = builder.get_object('menubar')
                app.set_menubar(menubar)
    
                self.add_simple_action('preferences', 
                        self.on_action_preferences_activated)
                self.add_simple_action('about', self.on_action_about_activated)
                self.add_simple_action('quit', self.on_action_quit_activated)
    
            def on_app_activate(self, app):
                self.window.show_all()
    
            def on_app_shutdown(self, app):
                # do some cleaning job here, like dumping configuration.
                pass
    
            def on_action_preferences_activated(self, action, user_data):
                print('will popup preferences dialog')
    
            def on_action_about_activated(self, action, user_data):
                print('will show about dialog')
    
            def on_action_quit_activated(self, action, user_data):
                # This will close the default gtk mainloop
                self.app.quit()
    
            def add_simple_action(self, name, callback):
                action = Gio.SimpleAction.new(name, None)
                action.connect('activate', callback)
                self.app.add_action(action)
    
    
        if __name__ == '__main__':
            app = App()
            app.run(sys.argv)
    

    【讨论】:

    • 你真的应该只编辑你以前的答案而不是发布新的答案。这些也不包括检查菜单项或单选菜单项。 :S
    • 哦,来吧。我应该为你写出整个应用程序吗?
    • 有没有办法在不使用派生自Gtk.Application 的类的情况下拥有Menubar 和 Toolbar?
    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多