如何使用PyGI GTK中的GIO操作创建完整的菜单?

时间:2013-10-20 18:53:59

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

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

我一直试图自己解决这个问题,但到目前为止看起来非常复杂,我没有太多运气。

如果有人可以请发布一个如何基于

创建简单菜单GAction的示例
  • 子菜单
  • 带有股票ID图标/热键
  • 的菜单项
  • 带有非库存图标/热键的菜单项
  • 选中的菜单项
  • 和电台菜单项目组
  • 禁用(灰显)菜单项

这对我很有帮助。

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

enter image description here

如果有人可以复制使用GioActions显示的菜单项,那么我可以弄清楚它们是如何工作的,这将是很棒的。

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

1 个答案:

答案 0 :(得分:8)

现在添加一个菜单栏。

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