How to create a complete menu using GIO actions in PyGI GTK?

I am trying to convert a menu bar in my Gtk application, so it will use GActions (from Gio) and not GtkActions in Python3 using GObject Instrospection.

I tried to figure it out on my own, but so far it seems terribly complicated, and I have not been very lucky with it.

If someone can post an example of how to create a simple GAction menu based on

  • Submenu
  • Menu item with stock identifier icon / hotkey
  • Menu item with unsigned icon / hotkey
  • Verified menu item
  • And a group of radio menu items
  • Disabled (hidden) menu item

That would help me a lot.

EDIT : this is the menu that I have in my window:

enter image description here

If someone can reproduce the menu items shown with GioActions, I could understand how they work, it would be great.

By the way, in all the actions that I have, window callbacks are used, not application callbacks, so this menu-menu is not in the form of a menu.

+6
source share
1 answer

Now a menu is added.

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

Source: https://habr.com/ru/post/956361/


All Articles