Menus
Een menubalk is een van de meest zichtbare onderdelen van de GUI applicatie. Het is een groep van commando’s in de verschillende menu’s. Terwijl in de console toepassingen die u had om te onthouden al die mysterieuze commando’s, hier hebben we het grootste deel van de commando’s gegroepeerd. Voor de uitvoering van een menubalk in wxPython moeten er drie dingen. Een wx.MenuBar, een wx.Menu en een wx.MenuItem.
Een eenvoudig voorbeeld menu
![]()
Het maken van een menubalk in wxPython is heel eenvoudig. Nog maar een paar regels code.
#!/usr/bin/python
# simplemenu.py
import wx
class SimpleMenu(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(250, 150))menubar = wx.MenuBar()
file = wx.Menu()
file.Append(-1, 'Quit', 'Quit application')
menubar.Append(file, '&File')
self.SetMenuBar(menubar)self.Centre()
self.Show(True)app = wx.App()
SimpleMenu(None, -1, 'simple menu example')
app.MainLoop()
dockable menubalk
Onder Linux, kunnen we een dockable menubalk maken. Deze functie is niet beschikbaar in windows toepassingen. Maar soortgelijke ding kunnen we in Mac OS zien. De menubalk is uitgevoerd buiten het hoofdvenster.
![]()
#!/usr/bin/python
# dockable.py
import wx
class Dockable(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)menubar = wx.MenuBar(wx.MB_DOCKABLE)
file = wx.Menu()
edit = wx.Menu()
view = wx.Menu()
insr = wx.Menu()
form = wx.Menu()
tool = wx.Menu()
help = wx.Menu()menubar.Append(file, '&File')
menubar.Append(edit, '&Edit')
menubar.Append(view, '&View')
menubar.Append(insr, '&Insert')
menubar.Append(form, '&Format')
menubar.Append(tool, '&Tools')
menubar.Append(help, '&Help')
self.SetMenuBar(menubar)self.Centre()
self.Show(True)app = wx.App()
Dockable(None, -1, 'Dockable menubar')
app.MainLoop()
Iconen, snelkoppelingen, events
In het volgende gedeelte zullen we de verdere verbetering van onze menu voorbeeld. We zullen zien, hoe we iconen toe kunnen voegen aan onze menu’s. Pictogrammen geven aan onze verzoeken meer visueel aantrekkelijkheid. Tevens geven zij ons meer inzicht in het menu commando’s. We zullen zien, hoe we het kunnen toevoegen snelkoppelingen naar onze menu’s. Zij stellen ons in staat sneller te werken met onze applicaties. Een van de meest gebruikte is de sneltoets Ctrl + S (Opslaan). Het is handig om sneltoets te gebruikten dan zoeken iets in menu om te klikken.
#!/usr/bin/python
# menuexample.py
import wx
class MenuExample(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(250, 150))menubar = wx.MenuBar()
file = wx.Menu()
quit = wx.MenuItem(file, 1, '&Quit\tCtrl+Q')
quit.SetBitmap(wx.Bitmap('icons/exit.png'))
file.AppendItem(quit)self.Bind(wx.EVT_MENU, self.OnQuit, id=1)
menubar.Append(file, '&File')
self.SetMenuBar(menubar)self.Centre()
self.Show(True)def OnQuit(self, event):
self.Close()app = wx.App()
MenuExample(None, -1, '')
app.MainLoop()
Submenus
Elk menu kan ook een submenu bevatten. Op deze manier kunnen wij soortgelijke commnads groeperen. Zo kunnen we plaats commando’s die tonen / verbergen verschillende toolbars, zoals persoonlijke bar, adresbalk, status bar of navigatiebalk in een submenu inwerken. Binnen een menu, kunnen we commando’s scheiden met een separator.
![]()
#!/usr/bin/python
# submenu.py
import wx
ID_QUIT = 1
class SubmenuExample(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(350, 250))menubar = wx.MenuBar()
file = wx.Menu()
file.Append(-1, '&New')
file.Append(-1, '&Open')
file.Append(-1, '&Save')
file.AppendSeparator()imp = wx.Menu()
imp.Append(-1, 'Import newsfeed list…')
imp.Append(-1, 'Import bookmarks…')
imp.Append(-1, 'Import mail…')file.AppendMenu(-1, 'I&mport', imp)
quit = wx.MenuItem(file, ID_QUIT, '&Quit\tCtrl+W')
quit.SetBitmap(wx.Bitmap('icons/exit.png'))
file.AppendItem(quit)self.Bind(wx.EVT_MENU, self.OnQuit, id=ID_QUIT)
menubar.Append(file, '&File')
self.SetMenuBar(menubar)self.Centre()
self.Show(True)def OnQuit(self, event):
self.Close()app = wx.App()
SubmenuExample(None, -1, 'Submenu')
app.MainLoop()
Diverse menu-items
Er zijn drie soorten menu-items.
* Normale post
* Controleer item
* Radio-item
#!/usr/bin/python
# checkmenuitem.py
import wx
ID_STAT = 1
ID_TOOL = 2class CheckMenuItem(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(350, 250))menubar = wx.MenuBar()
file = wx.Menu()
view = wx.Menu()
self.shst = view.Append(ID_STAT, 'Show statubar', 'Show Statusbar', kind=wx.ITEM_CHECK)
self.shtl = view.Append(ID_TOOL, 'Show toolbar', 'Show Toolbar', kind=wx.ITEM_CHECK)
view.Check(ID_STAT, True)
view.Check(ID_TOOL, True)self.Bind(wx.EVT_MENU, self.ToggleStatusBar, id=ID_STAT)
self.Bind(wx.EVT_MENU, self.ToggleToolBar, id=ID_TOOL)menubar.Append(file, '&File')
menubar.Append(view, '&View')
self.SetMenuBar(menubar)self.toolbar = self.CreateToolBar()
self.toolbar.AddLabelTool(3, '', wx.Bitmap('icons/quit.png'))self.statusbar = self.CreateStatusBar()
self.Centre()
self.Show(True)def ToggleStatusBar(self, event):
if self.shst.IsChecked():
self.statusbar.Show()
else:
self.statusbar.Hide()def ToggleToolBar(self, event):
if self.shtl.IsChecked():
self.toolbar.Show()
else:
self.toolbar.Hide()app = wx.App()
CheckMenuItem(None, -1, 'check menu item')
app.MainLoop()
Context menu
Het is een lijst van commando’s die onder bepaalde context. Bijvoorbeeld, in een Firefox webbrowser, wanneer we klikken met de rechtermuisknop op een webpagina, dan krijgen we een context menu. Hier kunnen we opnieuw laden van een pagina, ga terug of bekijk de pagina bron. Als we klikken met de rechtermuisknop op een werkbalk, dan krijgen we een andere context-menu voor het beheer van de werkbalken. Context menu’s worden ook wel pop-up menu’s genoemd.
#!/usr/bin/python
# contextmenu.py
import wx
class MyPopupMenu(wx.Menu):
def __init__(self, parent):
wx.Menu.__init__(self)self.parent = parent
minimize = wx.MenuItem(self, wx.NewId(), 'Minimize')
self.AppendItem(minimize)
self.Bind(wx.EVT_MENU, self.OnMinimize, id=minimize.GetId())close = wx.MenuItem(self, wx.NewId(), 'Close')
self.AppendItem(close)
self.Bind(wx.EVT_MENU, self.OnClose, id=close.GetId())def OnMinimize(self, event):
self.parent.Iconize()def OnClose(self, event):
self.parent.Close()class ContextMenu(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(250, 150))self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
self.Center()
self.Show()def OnRightDown(self, event):
self.PopupMenu(MyPopupMenu(self), event.GetPosition())app = wx.App()
frame = ContextMenu(None, -1, 'context menu')
app.MainLoop()
