Menyer¶
Observera
Gtk.UIManager
, Gtk.Action
och Gtk.ActionGroup
är föråldrade sedan GTK+ version 3.4 och bör inte användas i nyskriven kod. Använd ramverket Application istället.
GTK+ kommer med två olika sorters menyer, Gtk.MenuBar
och Gtk.Toolbar
. Gtk.MenuBar
är en standardmenyrad vilken innehåller en eller flera instanser av Gtk.MenuItem
eller en av dess underklasser. Gtk.Toolbar
-komponenter används för snabb åtkomst till vanligen använda funktioner för ett program. Exempel inkluderar att skapa ett nytt dokument, skriva ut en sida eller ångra en operation. Den innehåller en eller flera instanser av Gtk.ToolItem
eller en av dess underklasser.
Åtgärder¶
Även om det finns specifika API:er för att skapa menyer och verktygsfält så bör du använda Gtk.UIManager
och skapa Gtk.Action
-instanser. Åtgärder organiseras i grupper. En Gtk.ActionGroup
är i huvudsak en avbildning från namn till Gtk.Action
-objekt. Alla åtgärder som skulle vara rimliga att använda i ett visst sammanhang bör vara i en enskild grupp. Flera åtgärdsgrupper kan användas för ett specifikt användargränssnitt. Det förväntas faktiskt att de flesta icke-triviala programmen använder flera grupper. Exempelvis ett program som kan redigera flera dokument, med en grupp som innehåller globala åtgärder (t.ex. avsluta, om, nytt), och en grupp per dokument som innehåller åtgärder som agerar på det dokumentet (t.ex. spara, klipp ut/kopiera/klistra in o.s.v.). Varje fönsters menyer skulle då konstrueras från en kombination av två åtgärdsgrupper.
Det finns olika klasser som representerar olika typer av åtgärd:
Gtk.Action
: En åtgärd som kan utlösas genom ett meny- eller verktygsfältsobjektGtk.ToggleAction
: En åtgärd som kan växlas mellan två tillståndGtk.RadioAction
: En åtgärd för vilken endast en i en grupp kan vara aktivGtk.RecentAction
: En åtgärd som representerar en lista över senast använda filer
Åtgärder representerar operationer som användaren kan utföra, tillsammans med lite information om hur det ska visas i gränssnittet, inklusive dess namn (ej för visning), dess etikett (för visning), en snabbtangent, huruvida en etikett indikerar en inforuta såväl som återanropet som anropas när åtgärden aktiveras.
Du kan skapa åtgärder antingen genom att anropa en av konstruktorerna direkt och lägga till dem till en Gtk.ActionGroup
genom att anropa Gtk.ActionGroup.add_action()
eller Gtk.ActionGroup.add_action_with_accel()
, eller genom att anropa en av bekvämlighetsfunktionerna:
Observera att du måste ange åtgärder för undermenyer såväl som för menyobjekt.
Användargränssnittshanterare¶
Gtk.UIManager
tillhandahåller ett enkelt sätt att skapa menyer och verktygsfält med en XML-liknande beskrivning.
Först bör du lägga till Gtk.ActionGroup
till användargränssnittshanteraren med Gtk.UIManager.insert_action_group()
. Vid denna punkt är det också god idé att säga till föräldrafönstret att svara på de angivna tangentbordsgenvägarna genom att använda Gtk.UIManager.get_accel_group()
och Gtk.Window.add_accel_group()
.
Sedan kan du definiera den faktiska synliga layouten för menyerna och verktygsfälten, och lägga till användargränssnittslayouten. Denna ”ui-sträng” använder ett XML-format, i vilket du bör nämna namnen på åtgärderna som du redan skapat. Kom ihåg att dessa namn bara är identifierarna som vi använde då vi skapade åtgärderna. De är inte texten som användaren kommer se i menyerna och verktygsfälten. Vi tillhandahöll dessa mänskligt läsbara namn då vi skapade åtgärderna.
Slutligen erhåller du rotkomponenten med Gtk.UIManager.get_widget()
och lägger till komponenten till en behållare så som Gtk.Box
.
Exempel¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk UI_INFO = """ <ui> <menubar name='MenuBar'> <menu action='FileMenu'> <menu action='FileNew'> <menuitem action='FileNewStandard' /> <menuitem action='FileNewFoo' /> <menuitem action='FileNewGoo' /> </menu> <separator /> <menuitem action='FileQuit' /> </menu> <menu action='EditMenu'> <menuitem action='EditCopy' /> <menuitem action='EditPaste' /> <menuitem action='EditSomething' /> </menu> <menu action='ChoicesMenu'> <menuitem action='ChoiceOne'/> <menuitem action='ChoiceTwo'/> <separator /> <menuitem action='ChoiceThree'/> </menu> </menubar> <toolbar name='ToolBar'> <toolitem action='FileNewStandard' /> <toolitem action='FileQuit' /> </toolbar> <popup name='PopupMenu'> <menuitem action='EditCopy' /> <menuitem action='EditPaste' /> <menuitem action='EditSomething' /> </popup> </ui> """ class MenuExampleWindow(Gtk.Window): def __init__(self): super().__init__(title="Menu Example") self.set_default_size(200, 200) action_group = Gtk.ActionGroup(name="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(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(name="FileMenu", label="File") action_group.add_action(action_filemenu) action_filenewmenu = Gtk.Action(name="FileNew", stock_id=Gtk.STOCK_NEW) action_group.add_action(action_filenewmenu) action_new = Gtk.Action( name="FileNewStandard", label="_New", tooltip="Create a new file", stock_id=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(name="FileQuit", stock_id=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", "<control><alt>S", None, self.on_menu_others, ), ] ) def add_choices_menu_actions(self, action_group): action_group.add_action(Gtk.Action(name="ChoicesMenu", label="Choices")) 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(name="ChoiceThree", label="Three") 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("destroy", Gtk.main_quit) window.show_all() Gtk.main() |