lunedì 31 dicembre 2012

Menu - seconda parte

 Salve!

Quando vogliamo sapere se un'opzione è attiva o no e vogliamo gestirla con un menu possiamo usare i check menu, eccone un esempio (chm.py):


#!/usr/bin/python
# -*- coding: utf-8 -*-

# da ZetCode wxPython tutorial
# www.zetcode.com

import wx


class Example(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs) 
        self.InitUI()
        
    def InitUI(self):    
        menubar = wx.MenuBar()
        fileMenu = wx.Menu()
        viewMenu = wx.Menu()
        
        self.shst = viewMenu.Append(wx.ID_ANY, 'Show statubar', 
            'Show Statusbar', kind=wx.ITEM_CHECK)
        self.shtl = viewMenu.Append(wx.ID_ANY, 'Show toolbar', 
            'Show Toolbar', kind=wx.ITEM_CHECK)
            
        viewMenu.Check(self.shst.GetId(), True)
        viewMenu.Check(self.shtl.GetId(), True)

        self.Bind(wx.EVT_MENU, self.ToggleStatusBar, self.shst)
        self.Bind(wx.EVT_MENU, self.ToggleToolBar, self.shtl)

        menubar.Append(fileMenu, '&File')
        menubar.Append(viewMenu, '&View')
        self.SetMenuBar(menubar)

        self.toolbar = self.CreateToolBar()
        self.toolbar.AddLabelTool(1, '', wx.Bitmap('texit.png'))
        self.toolbar.Realize()

        self.statusbar = self.CreateStatusBar()
        self.statusbar.SetStatusText('Ready')

        self.SetSize((350, 250))
        self.SetTitle('Check menu item')
        self.Centre()
        self.Show(True)
        
    def ToggleStatusBar(self, e):
        
        if self.shst.IsChecked():
            self.statusbar.Show()
        else:
            self.statusbar.Hide()

    def ToggleToolBar(self, e):
        
        if self.shtl.IsChecked():
            self.toolbar.Show()
        else:
            self.toolbar.Hide()        

def main():
    ex = wx.App()
    Example(None)
    ex.MainLoop()    


if __name__ == '__main__':
    main()
Per la visualizzazione della toolbar vi serve un file, texit.png, propongo questo ma va bene qualunque, non troppo grande
Allora: dopo aver definito il menu viewMenu, come nel post precedente aggiungiamo le voci di menu shst e shtl con l'opzione wx.ITEM_CHECK. Con il metodo Check definiamo inoltre che siano visibili al lancio dell'applicazione. IsChecked() serve a controllare l'opzione è attiva, vedi i metodi ToggleStatusBar e ToggleTooBar. È molto più facile farla che raccontarla, vi conviene esaminare da soli il codice, dai è corto e facile.

A me personalmente i menu non piacciono, tranne un tipo: il context menu, quello che si attiva normalmente con il tasto destro del mouse. Ecco un esempio (td.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

# da ZetCode wxPython tutorial
# www.zetcode.com

import wx

class MyPopupMenu(wx.Menu):
    def __init__(self, parent):
        super(MyPopupMenu, self).__init__()
        self.parent = parent
        mmi = wx.MenuItem(self, wx.NewId(), 'Minimize')
        self.AppendItem(mmi)
        self.Bind(wx.EVT_MENU, self.OnMinimize, mmi)

        cmi = wx.MenuItem(self, wx.NewId(), 'Close')
        self.AppendItem(cmi)
        self.Bind(wx.EVT_MENU, self.OnClose, cmi)


    def OnMinimize(self, e):
        self.parent.Iconize()

    def OnClose(self, e):
        self.parent.Close()
        

class Example(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs) 
            
        self.InitUI()
        
    def InitUI(self):
        self.Bind(wx.EVT_RIGHT_UP, self.OnRightDown)

        self.SetSize((250, 200))
        self.SetTitle('Context menu')
        self.Centre()
        self.Show(True)
        
    def OnRightDown(self, e):
        self.PopupMenu(MyPopupMenu(self), e.GetPosition())

def main():
    ex = wx.App()
    Example(None)
    ex.MainLoop()    

if __name__ == '__main__':
    main()
In questo caso il menu MyPopupMenu viene creato come classe e attivato nel frame Example con Bind. Notare che il metodo è wx.EVT_RIGHT_DOWN, potete usare UP al posto di DOWN ma non cambia molto.

Se l'applicazione è semplice invece del menu io preferisco le toolbar. Un esempio completo di toolbar verrà sviluppato in un prossimo post, per adesso solo un assaggio (tbar.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

# da ZetCode wxPython tutorial
# www.zetcode.com

import wx

class Example(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs) 
            
        self.InitUI()
        
    def InitUI(self):    
        toolbar = self.CreateToolBar()
        qtool1 = toolbar.AddLabelTool(wx.ID_ANY, 'Prova', wx.Bitmap('tprova.png'))
        qtool2 = toolbar.AddLabelTool(wx.ID_ANY, 'Quit', wx.Bitmap('texit.png'))
        toolbar.Realize()

        self.Bind(wx.EVT_TOOL, self.OnQuit, qtool2)

        self.SetSize((250, 200))
        self.SetTitle('Simple toolbar')
        self.Centre()
        self.Show(True)
        
    def OnQuit(self, e):
        self.Close()

def main():
    ex = wx.App()
    Example(None)
    ex.MainLoop()    

if __name__ == '__main__':
    main()
vi serve un altro file tprova.png. Notare che la toolbar viene automaticamente dimensionata per contenere l'immagine più grande; conviene quindi averle tutte di dimensioni uguali o quasi.
Juhan

 L'indice del progetto "Mission Python" lo trovate qui

Non ci resta che augurarvi BUON ANNO!!

E alla prossima!

Nessun commento:

Posta un commento