Как создать полное меню с помощью GIO Actions в PyGI GTK?

Я пытаюсь преобразовать строку меню в своем приложении Gtk, чтобы оно использовало GActions (из Gio), а не GtkActions в Python3 с использованием GObject Instrospection.

Я пытался понять это самостоятельно, но пока это кажется ужасно сложным, и мне не очень повезло с этим.

Если кто-то может опубликовать пример того, как создать простое меню GAction на основе

  • Подменю
  • Пункт меню со значком идентификатора акции/горячей клавишей
  • Пункт меню с нестандартной иконкой/горячей клавишей
  • Отмеченный пункт меню
  • И группа пунктов меню радио
  • Неактивный (серый) пункт меню

Это действительно очень помогло бы мне.

EDIT: это панель меню, которая сейчас у меня в окне:

введите здесь описание изображения

Если бы кто-то мог воспроизвести элементы меню, показанные с помощью GioActions, это было бы здорово, чтобы я мог понять, как они работают.

Кстати, все действия, которые у меня есть, используют обратные вызовы окна, а не обратные вызовы приложения, так что это панель меню окна, а не панель меню приложения.


person OdraEncoded    schedule 20.10.2013    source источник


Ответы (1)


Добавлена ​​строка меню.

#!/usr/bin/env python3

# Copyright (C) 2013 LiuLang <[email protected]>

# 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)
person LiuLang    schedule 26.10.2013
comment
Вы действительно должны просто отредактировать свой предыдущий ответ, а не публиковать новые. Кроме того, они не включают элементы меню проверки или элементы меню радио. :С - person OdraEncoded; 26.10.2013
comment
О, да ладно. Должен ли я написать все приложение для вас? - person LiuLang; 26.10.2013
comment
Есть ли способ получить Menubar и Toolbar без использования класса, производного от Gtk.Application? - person buhtz; 25.04.2018