2013-10-20 17 views
6

Sto provando a convertire la barra dei menu nella mia app Gtk in modo che utilizzi GActions (dal Gio) rispetto a GtkActions in Python3 utilizzando GObject Instrospection.Come creare un menu completo utilizzando GIO Actions in PyGI GTK?

Ho cercato di capirlo da solo ma finora sembra terribilmente complicato e non ho avuto molta fortuna.

Se qualcuno potesse si prega di inviare un esempio di come creare un semplice menu GAction based con

  • un sottomenu
  • Una voce di menu con uno stock di ID icona/hotkey
  • Una voce di menu con un non-Stock icona/hotkey
  • Una voce di menu selezionata
  • E la voce di menu Radio gruppo
  • Un disabile (o grigio ut) voce di menu

Mi aiuterebbe molto.

EDIT: Questa è la barra dei menu che ho nella mia finestra ora:

enter image description here

Se qualcuno potesse replicare le voci di menu mostrati usando GioActions sarebbe così ho potuto capire come lavorare sarebbe essere grande.

A proposito, tutte le azioni che uso le richiamate delle finestre non richiamano le app, quindi questa è una barra dei menu delle finestre e non una barra dei menu dell'app.

risposta

7

Si aggiunge una barra dei menu.

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

Dovresti davvero modificare la tua risposta precedente invece di postarne di nuove. Inoltre, questi non includono le voci del menu di controllo o le voci del menu radio. : S – OdraEncoded

+4

Oh, andiamo. Dovrei scrivere l'intera app per te? – LiuLang

Problemi correlati