GTK3 – Menu

3
OK, questo mi serve, non come i due precedenti. Quindi esame dettagliato.
GTK+ ha due tipi di menu: Gtk.MenuBar e Gtk.Toolbar.

Azioni

Create attraverso Gtk.Action, ce ne sono di diversi tipi, con diversi tipi di azioni.

class Gtk.Action(name, label, tooltip, stock_id)
name dev’essere univoco per l’azione;
se label non è None viene visualizzata;
se tooltip non è None viene visualizzato come suggerimento;
se non è None stock_id si riferisce agli oggetti di stock item;

class Gtk.ToggleAction(name, label, tooltip, stock_id)
gli argomenti sono gli stessi di Gtk.Action.

class Gtk.RadioAction(name, label, tooltip, stock_id, value)
i primi 4 sono gli stessi di Gtk.Action, value indica la selezione di get_current_value().

get_current_value()
ritorna l’elemento attivo.

join_group(group_source)
aggiunge questo oggetto a group_source; questo dev’essere un oggetto radio o None per rimuoverlo dal gruppo.

class Gtk.ActionGroup(name)
crea una nuova istanza a Gtk.ActionGroup. name è usato per collegare le azioni.

add_action(action)
aggiunge un oggetto Gtk.Action.

add_action_with_accel(action, accelerator)
aggiunge un oggetto Gtk.Action e setta l’acceleratore.

add_actions(entries[, user_data])
aggiunge più oggetti tutti in una volta, panico (un pochino).

add_toggle_actions(entries[, user_data])
idem per i toggle.

add_radio_actions(entries[, value[, on_change[, user_data]]])
idem per i radio.

Gtk.accelerator_parse(accelerator)
per gli acceleratori, sempre più panico.

UI manager

Gtk.UIManager consente di creare menu e toolbar con una sintassi XML.

class Gtk.UIManager

insert_action_group(action_group[, pos])
inserisce action_group nella lista dei gruppi; pos è la posizione in cui va inserita, se omessa l’azione è appesa.

get_accel_group()
ritorna il gruppo degli acceleratori.

get_widget(path)
ritorna l’oggetto nella path XML o None se non c’è.

add_ui_from_string(text)
esamina (parse) text per una definizione UI e lo aggiunge al manager corrente.

OK, la speranza è che l’esame del codice risulti più chiara delle note precedenti, ecco mn.py:

#!/usr/bin/python3

# mn.py

from gi.repository import Gtk, Gdk

UI_INFO = """

</pre>
<menu><menu></menu>
 </menu><menu></menu><menu></menu>
<pre>

"""

class MenuExampleWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Menu Example")

        self.set_default_size(200, 200)

        action_group = Gtk.ActionGroup("my_actions")

        self.add_file_menu_actions(action_group)
        self.add_edit_menu_actions(action_group)
        self.add_choices_menu_actions(action_group)

        uimanager = self.create_ui_manager()
        uimanager.insert_action_group(action_group)

        menubar = uimanager.get_widget("/MenuBar")

        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        box.pack_start(menubar, False, False, 0)

        toolbar = uimanager.get_widget("/ToolBar")
        box.pack_start(toolbar, False, False, 0)

        eventbox = Gtk.EventBox()
        eventbox.connect("button-press-event", self.on_button_press_event)
        box.pack_start(eventbox, True, True, 0)

        label = Gtk.Label("Right-click to see the popup menu.")
        eventbox.add(label)

        self.popup = uimanager.get_widget("/PopupMenu")

        self.add(box)

    def add_file_menu_actions(self, action_group):
        action_filemenu = Gtk.Action("FileMenu", "File", None, None)
        action_group.add_action(action_filemenu)

        action_filenewmenu = Gtk.Action("FileNew", None, None, Gtk.STOCK_NEW)
        action_group.add_action(action_filenewmenu)

        action_new = Gtk.Action("FileNewStandard", "_New",
            "Create a new file", Gtk.STOCK_NEW)
        action_new.connect("activate", self.on_menu_file_new_generic)
        action_group.add_action_with_accel(action_new, None)

        action_group.add_actions([
            ("FileNewFoo", None, "New Foo", None, "Create new foo",
             self.on_menu_file_new_generic),
            ("FileNewGoo", None, "_New Goo", None, "Create new goo",
             self.on_menu_file_new_generic),
        ])

        action_filequit = Gtk.Action("FileQuit", None, None, Gtk.STOCK_QUIT)
        action_filequit.connect("activate", self.on_menu_file_quit)
        action_group.add_action(action_filequit)

    def add_edit_menu_actions(self, action_group):
        action_group.add_actions([
            ("EditMenu", None, "Edit"),
            ("EditCopy", Gtk.STOCK_COPY, None, None, None,
             self.on_menu_others),
            ("EditPaste", Gtk.STOCK_PASTE, None, None, None,
             self.on_menu_others),
            ("EditSomething", None, "Something", "S", None,
             self.on_menu_others)
        ])

    def add_choices_menu_actions(self, action_group):
        action_group.add_action(Gtk.Action("ChoicesMenu", "Choices", None,
            None))

        action_group.add_radio_actions([
            ("ChoiceOne", None, "One", None, None, 1),
            ("ChoiceTwo", None, "Two", None, None, 2)
        ], 1, self.on_menu_choices_changed)

        three = Gtk.ToggleAction("ChoiceThree", "Three", None, None)
        three.connect("toggled", self.on_menu_choices_toggled)
        action_group.add_action(three)

    def create_ui_manager(self):
        uimanager = Gtk.UIManager()

        # Throws exception if something went wrong
        uimanager.add_ui_from_string(UI_INFO)

        # Add the accelerator group to the toplevel window
        accelgroup = uimanager.get_accel_group()
        self.add_accel_group(accelgroup)
        return uimanager

    def on_menu_file_new_generic(self, widget):
        print("A File|New menu item was selected.")

    def on_menu_file_quit(self, widget):
        Gtk.main_quit()

    def on_menu_others(self, widget):
        print("Menu item " + widget.get_name() + " was selected")

    def on_menu_choices_changed(self, widget, current):
        print(current.get_name() + " was selected.")

    def on_menu_choices_toggled(self, widget):
        if widget.get_active():
            print(widget.get_name() + " activated")
        else:
            print(widget.get_name() + " deactivated")

    def on_button_press_event(self, widget, event):
        # Check if right mouse button was preseed
        if event.type == Gdk.EventType.BUTTON_PRESS and event.button == 3:
            self.popup.popup(None, None, None, None, event.button, event.time)
            return True # event has been handled

window = MenuExampleWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()

mn

Annunci
Post a comment or leave a trackback: Trackback URL.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: