PyGTK - MenuBar, Menu et MenuItem
Une barre horizontale juste en dessous de la barre de titre d'un gtk.Window de niveau supérieur est réservée à l'affichage d'une série de menus. C'est un objet de la classe gtk.MenuBar dans l'API PyGTK.
Un objet de la classe gtk.Menu est ajouté à la barre de menus. Il est également utilisé pour créer un menu contextuel et un menu contextuel. Chaque menu peut contenir un ou plusieurs widgets gtk.MenuItem. Certains d'entre eux peuvent être un sous-menu et avoir des boutons MenuItem en cascade.
Le gtk.MenuBar est sous-classé de la classe gtk.MenuShell. Il a un constructeur par défaut simple -
gtk.MenuBar()
Pour ajouter un menu à MenuBar, la méthode append () de la classe MenuBar est utilisée.
Afin de construire un menu, créez un widget MenuItem avec une étiquette qui doit apparaître dans la barre de menus et définissez-le comme sous-menu.
Par exemple, le code suivant est utilisé pour configurer un menu Fichier -
menu1 = gtk.Menu()
file = gtk.MenuItem("_File")
file.set_submenu(menu1)
Maintenant, un ou plusieurs widgets de la classe MenuItem peuvent être ajoutés dans le menu.
item1 = gtk.MenuItem("New")
item2 = gtk.MenuItem("Open")
Ces MenuItems sont ajoutés au widget Menu et l'objet de menu à son tour est ajouté à la barre de menus.
menu1.append(item1)
menu1.append(item2)
mb.append(menu1)
La boîte à outils PyGTK propose de nombreux types de widgets MenuItem. Un ImageMenuItem est un élément de menu auquel est associée une image. Vous pouvez utiliser n'importe laquelle des images de stock en utilisant le paramètre ID de stock ou attribuer une autre image à l'aide de la méthode set_image ().
Par exemple, l'élément de menu 'Nouveau' ayant une image est créé de la manière suivante -
new = gtk.ImageMenuItem(gtk.STOCK_NEW)
menu1.append(new)
De même, il est également possible d'ajouter CheckMenuItem en utilisant le code suivant -
chk = gtk.CheckMenuItem("Checkable")
menu1.append(chk)
Un groupe d'éléments radio peut également être ajouté à l'aide de ce code -
radio1 = gtk.RadioMenuItem(None,"Radio1")
radio2 = gtk.RadioMenuItem(radio1, "Radio2")
menu1.append(radio1)
menu1.append(radio2)
Parfois, vous souhaiterez peut-être ajouter une ligne de séparation entre les éléments de menu. À cette fin, leSeparatorMenuItem est également disponible.
sep = gtk.SeparatorMenuItem()
menu1.append(sep)
Vous pouvez également attribuer des raccourcis clavier aux éléments de menu. PyGTK a des accélérateurs. Commencez par créer un groupe d'accélérateurs et attachez-le à la fenêtre de niveau supérieur.
acgroup = gtk.AccelGroup()
self.add_accel_group(acgroup)
Pour attribuer un raccourci, utilisez add_accelerator() fonction avec le prototype suivant -
Item1.add_accelerator(signal, group, key, modifier, flags)
Voici quelques-uns des modificateurs prédéfinis -
- SHIFT_MASK
- LOCK_MASK
- CONTROL_MASK
- BUTTON1_MASK
- BUTTON1_MASK
Afin d'attribuer le raccourci Ctrl + N à l'élément Nouveau menu, utilisez la syntaxe suivante -
new = gtk.ImageMenuItem(gtk.STOCK_NEW,acgroup)
new.add_accelerator("activate", acgroup, ord('N'),
gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
Exemple
L'exemple suivant montre les fonctionnalités décrites ci-dessus -
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()
Le code ci-dessus produira la sortie suivante -