giovedì 27 dicembre 2012

Menu - prima parte

OK, la nostra finestra continua a essere completamente vuota, dobbiamo farne qualcosa, no?
Allora mettiamoci un menu (m0.py)


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

import wx

class Example(wx.Frame):
  
    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs) 
        menubar = wx.MenuBar()
        fileMenu = wx.Menu()
        fitem = fileMenu.Append(wx.ID_EXIT, 'Quit', 'Quit application')
        menubar.Append(fileMenu, '&File')
        self.SetMenuBar(menubar)
        
        self.Bind(wx.EVT_MENU, self.OnQuit, fitem)

        self.SetSize((300, 200))
        self.Move((100, 50))           
        self.Show(True)
        
    def OnQuit(self, e):
        self.Close()

#main
app = wx.App()
Example(None, title = 'Simple menu')
app.MainLoop()
Con Ubuntu dovete tener conto di tre cose: un messaggio di errore quando chiudete e ricordate che con Unity la barra dei menu è globale e niente icone.

I passi sono i seguenti:
creazione della barra dei menu con menubar = wx.MenuBar()
creazione di un menu: fileMenu = wx.Menu()
creazione di una voce (oggetto) di menu: fitem = fileMenu.Append(wx.ID_EXIT, 'Quit', 'Quit application')

dove il primo parametro è l'id dell'elemento (in questo caso quello standard di chiusura), il secondo la scritta che compare e il terzo il suggerimento (tooltip). Per aggiungerlo al menu usiamo Append() e per collegare il metodo da eseguire usiamo Bind(). Il carattere & sottolinea il carattere successivo e attiva la scorciatoia Alt+F.

Con Windows otterreste probabilmente qualcosa come questo:
Passiamo adesso a un caso più complesso: sottomenu e separatori (m1.py):
#!/usr/bin/python
# -*- coding: utf-8 -*-

# da ZetCode wxPython tutorial

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()
        fileMenu.Append(wx.ID_NEW, '&New')
        fileMenu.Append(wx.ID_OPEN, '&Open')
        fileMenu.Append(wx.ID_SAVE, '&Save')
        fileMenu.AppendSeparator()

        imp = wx.Menu()
        imp.Append(wx.ID_ANY, 'Import newsfeed list...')
        imp.Append(wx.ID_ANY, 'Import bookmarks...')
        imp.Append(wx.ID_ANY, 'Import mail...')

        fileMenu.AppendMenu(wx.ID_ANY, 'I&mport', imp)

        qmi = wx.MenuItem(fileMenu, wx.ID_EXIT, '&Quit\tCtrl+W')
        fileMenu.AppendItem(qmi)

        self.Bind(wx.EVT_MENU, self.OnQuit, qmi)

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

        self.SetSize((350, 250))
        self.SetTitle('Submenu')
        self.Centre()
        self.Show(True)
        
    def OnQuit(self, e):
        self.Close()

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

if __name__ == '__main__':
    main()
ecco, il menu imp viene appeso al menufileMenu e diventa quindi un suo sottomenu.

Ci sono ancora parecchie cose da dire sui menu (anche se a me non è che piacciano più di tanto tranne uno che tengo per ultimo) ma il discorso sarebbe troppo lungo. E poi è quasi festa, dai riprendiamo la prossima volta. E auguri.

Juhan

Vi ricordo che l'indice di "Mission Python" lo trovate qui.

1 commento: