Tutorial su wxPython

Marco Barisione


Capitolo 4

Menu, status bar e tool bar




Menu e barre di stato

Probabilmente si vuole fare qualcosa di più che creare una finestra vuota, per questo conviene creare una classe derivata da wxFrame e poi modificarla aggiungendo menu, barre di stato (status bar) e bare degli strumenti (tool bar).


01: class MioFrame(wxFrame):
02:     def __init__(self):
03:         # Chiama il costruttore di wxFrame.
04:         wxFrame.__init__(self, None, -1, "Prova con i menu")
05:
06:         ID_INFO = wxNewId()
07:         ID_ESCI = wxNewId()
08:         menu_file = wxMenu()
09:         menu_file.Append(ID_INFO, "&Informazioni...",
10:                          "Qualche informazione sul programma")
11:         menu_file.AppendSeparator()
12:         menu_file.Append(ID_ESCI, "&Esci",
13:                          "Esci dal programma")
14:         EVT_MENU(self, ID_INFO, self.OnInfo)
15:         EVT_MENU(self, ID_ESCI, self.OnEsci)
16:
17:         menu_bar = wxMenuBar()
18:         menu_bar.Append(menu_file, "&File");
19:         self.SetMenuBar(menu_bar)
20:
21:         # Crea una barra di stato con due pannelli.
22:         self.CreateStatusBar()
23:         # Imposta il testo della barra di stato.
24:         self.SetStatusText("Semplice barra di stato")
25:
26:     def OnInfo(self, event):
27:         # Mostra un semplice messaggio.
28:         wxMessageBox("Questo programma mostra "
29:                      "come usare i menu")
30:
31:     def OnEsci(self, event):
32:         # Distrugge il frame.
33:         self.Close(1)
esempio 4.1 [visualizza esempio completo]

Alla linea 6 dell'esempio 4.1 vengono generati due id per i controlli, non viene usato -1 perché sarà necessario usarli anche in seguito (linea 14).
Alla linea 8 viene creato un menu, nel quale vengono inserite due voci con la funzione Append, i tre parametri della funzione sono rispettivamente l'id, la stringa da mostrare nel menu ed infine una stringa più lunga che viene mostrata nella status bar quando il mouse si trova sulla voce del menu corrispondente.
Bisogna notare cher il secondo parametro contiene un simbolo '&' che non verrà mostrato, questo indica che il carattere seguente sarà sottolineato per indicare una scorciatoia da tastiera, cioè nel nostro caso si può con 'ALT+F' aprire il menu 'File' e poi con 'ALT+E' uscire dal programma. Sempre dal secondo parametro emerge una convenzione, cioè l'utilizzo di '...' per indicare che selezionando quella voce di menu verrà aperta un'altra finestra.
Fra le voci di menu può essere inserito un separatore (cioè una linea orizzontale) attraverso la funzione AppendSeparator.
Infine alla linea 17 viene creata una barra del menu in cui viene inserito il menu creato in precedenza. La barra viene poi associata alla finestra.



immagine 4.1

torna ad inizio pagina



Gli eventi

Quando si verifica una particolare situazione (un pulsante viene premuto, il mouse si muove...) il sistema operativo manda dei messaggi all'applicazione per comunicarglielo. wxWindows "lega" un particolare messaggio ad una funzione attraverso una serie di funzioni dette "helper" il cui nome inizia con "EVT_". Il nome di queste funzioni è strettamente collegato al tipo di evento che deve essere gestito (EVT_PAINT se è necessario ridisegnare una finestra, EVT_SIZE se la finestra viene ridimensionata e così via).
Le funzioni che devono gestire gli eventi accettano un argomento (convenzionalmente chiamato event) che contiene informazioni riguardo all'evento stesso.
Un esempio dell'uso degli eventi è nel esempio 4.1 alla linea 14, qui viene associato alla selezione della voce di menu con id ID_INFO la chiamata della funzione self.OnInfo.
torna ad inizio pagina



Barre degli strumenti

Un elemento spesso presente nelle applicazioni è una barra degli strumenti (in inglese tool bar) che permette di richiamare velocemente le funzioni più utilizzate. Le tool bar possono contenere non solo pulsanti ma anche altri controlli come combo box.



immagine 4.2



01: class MioFrame(wxFrame):
02:     def __init__(self):
03:         wxFrame.__init__(self, None, -1, "Toolbar")
04:         self.CreateStatusBar()
05:
06:         # Id utilizzati dal pulsante e dal combo
07:         # inseriti nella toolbar.
08:         ID_INFO = wxNewId()
09:         ID_COMBO = wxNewId()
10:         tb = self.CreateToolBar(wxTB_HORIZONTAL|
11:                                 wxNO_BORDER|wxTB_FLAT)
12:
13:         # bmp contiene un'immagine caricata dal
14:         # file "nuovo.bmp".
15:         bmp = wxBitmap("nuovo.bmp", wxBITMAP_TYPE_BMP)
16:         tb.AddSimpleTool(ID_INFO, bmp, "Nuovo",
17:                          "Crea un nuovo documento")
18:         # Alla pressione del pulsante viene chiamata self.OnNuovo.
19:         EVT_TOOL(self, ID_INFO, self.OnNuovo)
20:
21:         # Aggiunge un separatore fra i due controlli.
22:         tb.AddSeparator()
23:
24:         # Viene creato un combo box, maggiori informazioni
25:         # saranno date nei capitoli successivi.
26:         combo = wxComboBox(tb, ID_COMBO, choices =
27:                            ["Ciao", "sono", "un", "combobox"])
28:         # Il combo box appena creato viene inserito
29:         # nella tool bar.
30:         tb.AddControl(combo)
31:         # Quando viene cambiata la selezione nel combobox
32:         # viene chiamata self.on_combo.
33:         EVT_COMBOBOX(self, ID_COMBO, self.OnCombo)
34:
35:         # Realize deve essere chiamata affinché i cambiamenti
36:         # fatti alla toolbar siano visibili.
37:         tb.Realize()
38:
39:
40:     def OnNuovo(self, event):
41:         wxMessageBox("Questo funzione dovrebbe creare "
42:                      "un nuovo documento ma non è "
43:                      "stata implementata.")
44:
45:     def OnCombo(self, event):
46:         # Nella versione di wxPython utilizzata per la
47:         # scrittura del tutorial questa funzione
48:         # viene richiamata 3 volte a causa di un bug.
49:         wxMessageBox("La selezione del combobox è "
50:                      "stata cambiata.")
esempio 4.2 [visualizza esempio completo]

Alla linea 11 viene creata una tool bar associata alla finestra, l'argomento passato a CreateToolBar è composto dagli stili che si vuol dare alla barra, nel nostro caso deve essere orizzontale, senza bordo e con i pulsanti piatti; alcuni di questi valori però potrebbero essere ignorati da alcuni sistemi operativi (o anche solo da alcune versioni di essi).
Alla linea 17 viene aggiunto un pulsante alla tool bar attraverso la funzione AddSimpleTool, i cui argomenti sono l'id del controllo, l'immagine da associare al pulsante, un breve testo mostrato quando il mouse si posiziona sul controllo (tool tip) ed infine un testo più lungo che viene mostrato nella status bar. Per aggiungere altri tipi di controlli invece è necessario usare il metodo AddControl, come alla linea 30.
torna ad inizio pagina