PyGTK - MenuBar, Menu und MenuItem
Eine horizontale Leiste direkt unter der Titelleiste eines gtk auf oberster Ebene. Windows ist für die Anzeige einer Reihe von Menüs reserviert. Es ist ein Objekt der Klasse gtk.MenuBar in der PyGTK-API.
Ein Objekt der Klasse gtk.Menu wird der Menüleiste hinzugefügt. Es wird auch verwendet, um ein Kontextmenü und ein Popup-Menü zu erstellen. Jedes Menü kann ein oder mehrere gtk.MenuItem-Widgets enthalten. Einige von ihnen können ein Untermenü sein und kaskadierte MenuItem-Schaltflächen haben.
Die gtk.MenuBar ist in die gtk.MenuShell-Klasse unterteilt. Es hat einen einfachen Standardkonstruktor -
gtk.MenuBar()
Um MenuBar ein Menü hinzuzufügen, wird die append () -Methode der MenuBar-Klasse verwendet.
Um ein Menü zu erstellen, erstellen Sie ein MenuItem-Widget mit einer Bezeichnung, die in der Menüleiste angezeigt werden soll, und legen Sie es als Untermenü fest.
Der folgende Code wird beispielsweise zum Einrichten eines Dateimenüs verwendet:
menu1 = gtk.Menu()
file = gtk.MenuItem("_File")
file.set_submenu(menu1)
Jetzt können ein oder mehrere Widgets der MenuItem-Klasse im Menü hinzugefügt werden.
item1 = gtk.MenuItem("New")
item2 = gtk.MenuItem("Open")
Diese Menüelemente werden dem Menü-Widget hinzugefügt, und das Menüobjekt wird wiederum der Menüleiste hinzugefügt.
menu1.append(item1)
menu1.append(item2)
mb.append(menu1)
Das PyGTK-Toolkit bietet viele Arten von MenuItem-Widgets. Ein ImageMenuItem ist ein Menüelement, dem ein Bild zugeordnet ist. Sie können jedes der Bilder mit dem Parameter Stock ID verwenden oder jedes andere Bild mit der Methode set_image () zuweisen.
Beispielsweise wird der Menüpunkt "Neu" mit Bild folgendermaßen erstellt:
new = gtk.ImageMenuItem(gtk.STOCK_NEW)
menu1.append(new)
In ähnlicher Weise ist es auch möglich, CheckMenuItem mit dem folgenden Code hinzuzufügen:
chk = gtk.CheckMenuItem("Checkable")
menu1.append(chk)
Mit diesem Code kann auch eine Gruppe von Funkelementen hinzugefügt werden -
radio1 = gtk.RadioMenuItem(None,"Radio1")
radio2 = gtk.RadioMenuItem(radio1, "Radio2")
menu1.append(radio1)
menu1.append(radio2)
Manchmal möchten Sie möglicherweise eine Trennlinie zwischen den Menüelementen einfügen. Zu diesem Zweck hat dieSeparatorMenuItem ist ebenfalls verfügbar.
sep = gtk.SeparatorMenuItem()
menu1.append(sep)
Sie können Menüelementen auch Tastaturkürzel zuweisen. PyGTK hat Beschleuniger. Erstellen Sie zunächst eine Beschleunigergruppe und hängen Sie sie an das Fenster auf oberster Ebene an.
acgroup = gtk.AccelGroup()
self.add_accel_group(acgroup)
Verwenden Sie zum Zuweisen einer Verknüpfung add_accelerator() Funktion mit folgendem Prototyp -
Item1.add_accelerator(signal, group, key, modifier, flags)
Im Folgenden sind einige der vordefinierten Modifikatoren aufgeführt:
- SHIFT_MASK
- LOCK_MASK
- CONTROL_MASK
- BUTTON1_MASK
- BUTTON1_MASK
Verwenden Sie die folgende Syntax, um dem neuen Menüelement die Tastenkombination Strg + N zuzuweisen:
new = gtk.ImageMenuItem(gtk.STOCK_NEW,acgroup)
new.add_accelerator("activate", acgroup, ord('N'),
gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
Beispiel
Das folgende Beispiel zeigt die oben beschriebenen Funktionen:
import gtk
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_title("Menu Demo")
self.set_default_size(250, 200)
self.set_position(gtk.WIN_POS_CENTER)
mb = gtk.MenuBar()
menu1 = gtk.Menu()
file = gtk.MenuItem("_File")
file.set_submenu(menu1)
acgroup = gtk.AccelGroup()
self.add_accel_group(acgroup)
new = gtk.ImageMenuItem(gtk.STOCK_NEW,acgroup)
new.add_accelerator("activate", acgroup, ord('N'),
gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
menu1.append(new)
open = gtk.ImageMenuItem(gtk.STOCK_OPEN)
menu1.append(open)
chk = gtk.CheckMenuItem("Checkable")
menu1.append(chk)
radio1 = gtk.RadioMenuItem(None,"Radio1")
radio2 = gtk.RadioMenuItem(radio1, "Radio2")
menu1.append(radio1)
menu1.append(radio2)
sep = gtk.SeparatorMenuItem()
menu1.append(sep)
exit = gtk.ImageMenuItem(gtk.STOCK_QUIT)
menu1.append(exit)
menu2 = gtk.Menu()
edit = gtk.MenuItem("_Edit")
edit.set_submenu(menu2)
copy = gtk.ImageMenuItem(gtk.STOCK_COPY)
menu2.append(copy)
cut = gtk.ImageMenuItem(gtk.STOCK_CUT)
menu2.append(cut)
paste = gtk.ImageMenuItem(gtk.STOCK_PASTE)
menu2.append(paste)
mb.append(file)
mb.append(edit)
vbox = gtk.VBox(False, 2)
vbox.pack_start(mb, False, False, 0)
self.add(vbox)
self.connect("destroy", gtk.main_quit)
self.show_all()
if __name__ == '__main__':
PyApp()
gtk.main()
Der obige Code erzeugt die folgende Ausgabe -