Hi, I did test it out, here's a working version:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gio

class Window(Gtk.ApplicationWindow):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_default_size(200, 100)

        #
        self.interface_info = """
        <interface>
          <menu id='TheMenuModel'>
            <submenu>
              <attribute name='label'>Foo</attribute>
              <item>
                <attribute name='label'>Bar</attribute>
                <attribute name='action'>win.bar</attribute>
              </item>
            </submenu>
          </menu>
        </interface>
        """

        builder = Gtk.Builder.new_from_string(self.interface_info, -1)

        action_bar = Gio.SimpleAction.new('bar', None)
        action_bar.connect('activate', self.on_menu)
        self.add_action(action_bar)

        menumodel = builder.get_object('TheMenuModel')
        menubar = Gtk.MenuBar.new_from_model(menumodel)

        # layout
        self.layout = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.layout.pack_start(menubar, False, False, 0)
        self.add(self.layout)

        self.connect('destroy', Gtk.main_quit)
        self.show_all()

    def on_menu(self, action, value):
        print('on_menu')

if __name__ == '__main__':
    win = Window()
    Gtk.main()


2018-04-26 11:01 GMT+02:00 Luca Bacci <luca.bacci...@gmail.com>:

> it should be like that (I can't test it right now, try yourself)
>
> #!/usr/bin/env python3
> import gi
> gi.require_version('Gtk', '3.0')
> from gi.repository import Gtk
> from gi.repository import Gio
>
> class Window(Gtk.ApplicationWindow):
>     def __init__(self):
>         Gtk.Window.__init__(self)
>         self.set_default_size(200, 100)
>
>         #
>         self.interface_info = """
>         <interface>
>           <menu id='TheMenuModel'>
>             <section>
>               <attribute name='foo'>Foo</attribute>
>               <item>
>                 <attribute name='bar'>Bar</attribute>
>                 <attribute name="action">win.bar</attribute>
>               </item>
>             </section>
>           </menu>
>         </interface>
>         """
>
>         builder = Gtk.Builder.new_from_string(self.interface_info, -1)
>
>         action_bar = Gio.SimpleAction.new('bar', None)
>         action_bar.connect('activate', self.on_menu)
>         self.add_action(action_bar)
>
>         menumodel = builder.get_object('TheMenuModel')
>         menubar = Gtk.MenuBar.new_from_model(menumodel)
>
>         # layout
>         self.layout = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
>         self.layout.pack_start(menubar, True, True, 0)
>         self.add(self.layout)
>
>         self.connect('destroy', Gtk.main_quit)
>         self.show_all()
>
>     def on_menu(self, action, value):
>         print('on_menu')
>
> if __name__ == '__main__':
>     win = Window()
>     Gtk.main()
>
>
> 2018-04-26 10:44 GMT+02:00 Luca Bacci <luca.bacci...@gmail.com>:
>
>> see here:
>>
>> https://wiki.gnome.org/HowDoI/GMenu
>> https://wiki.gnome.org/HowDoI/GAction
>>
>> self.interface_info = """
>>>         <interface>
>>>           <menu id='TheMenu'>
>>>             <section>
>>>               <attribute name='foo'>Foo</attribute>
>>>               <item>
>>>                 <attribute name='bar'>Bar</attribute>
>>>               </item>
>>>             </section>
>>>           </menu>
>>>         </interface>
>>>         """
>>
>>
>> for every <item> you want to set at least two attributes: "name" and
>> "action". it should be
>>
>> self.interface_info = """
>>         <interface>
>>           <menu id='TheMenuModel'>
>>             <section>
>>               <attribute name='foo'>Foo</attribute>
>>               <item>
>>                 <attribute name='bar'>Bar</attribute>
>>                 <attribute name="action">win.bar</attribute>
>>               </item>
>>             </section>
>>           </menu>
>>         </interface>
>> """
>>
>> you get the GMenuModel from the builder
>> menumodel = builder.get_object('TheMenuModel')
>> and you create a menubar widget from the menumodel:
>>
>> menubar = Gtk.MenuBar.new_from_model(menumodel)
>>
>>
>> 2018-04-26 7:10 GMT+02:00 <c.bu...@posteo.jp>:
>>
>>> Dear Eric,
>>>
>>> thank you for your quick reply.
>>>
>>> > There is a basic setup for the Gtk Application in Python here
>>> > https://developer.gnome.org/gnome-devel-demos/stable/hello-w
>>> orld.py.html.en
>>>
>>> Nice to know. Very helpful.
>>>
>>> > For C you can check
>>> > https://github.com/cecashon/OrderedSetVelociRaptor/blob/mast
>>> er/Misc/Csamples/gtk_app1.c
>>> > which has a menu but doesn't use builder with an application. Maybe
>>> > partial help.
>>>
>>> This code doesn't help me with my problem but brings up two questions.
>>>
>>> 1.
>>> It uses "QMenu" (from Gtk or Gio?) to build a menu structure. I would
>>> prefere this way instead of an XML string. It should be possible
>>> in Python, too? Gtk.Menu or Gio.Menu?
>>>
>>> 2.
>>> It uses " gtk_application_set_menubar()" which I don't want to use.
>>> Because there is no "gtk_application_set_TOOLBAR()"! I need the menubar
>>> and the toolbar as a widget to add them myself to the main window.
>>> Or a " gtk_application_set_toolbar()" - don't understand why there
>>> isn't one.
>>>
>>> It couldn't be so hard to create a menubar and a toolbar with
>>> PyGObject?! Am I the first one who tries this? ;)
>>> _______________________________________________
>>> gtk-app-devel-list mailing list
>>> gtk-app-devel-list@gnome.org
>>> https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>>>
>>
>>
>
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to