Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
463 views
in Technique[技术] by (71.8m points)

python - How to create a complete menu using GIO Actions in PyGI GTK?

I'm trying to convert the menubar in my Gtk app so it will use GActions(from the Gio) as opposed of GtkActions in Python3 using GObject Instrospection.

I've been trying to figure it out on my own but so far it seems awfully complicated and I didn't have much luck with it.

If someone could please post an example of how to create a simple menu GAction based with

  • A submenu
  • A menu item with a stock ID icon / hotkey
  • A menu item with a non-stock icon / hotkey
  • A checked menu item
  • And radio menu item group
  • A disabled(grayed out) menu item

It would really help me a lot.

EDIT: This is the menubar I have in my window now:

enter image description here

If someone could replicate the menu items shown using GioActions it would so I could figure out how they work it would be great.

By the way, all of the actions I have use window callbacks not app callbacks, so this is a window menubar not a app menubar.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

A menubar is added now.

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...