Tutorial su wxPython

Marco Barisione


Capitolo 6

Controlli




wxControl

La classe wxControl è la base di tutti i controlli (o widget) come pulsanti o controlli di testo, i due metodi di uso frequente della classe sono:
torna ad inizio pagina



wxStaticText

Forse il modo più semplice per presentare delle informazioni agli utenti è attraverso dei controlli statici di testo, cioè il tipico controllo senza bordo in cui viene visualizzato del testo che non può essere modificato dall'utente.

01: st = wxStaticText(dlg, -1, "Ciao")
02: # Il testo non può essere cambiato dal'utente ma ovviamente
03: # può essere cambiato dal programma
04: st.SetLabel("Ciao mondo!")
esempio 6.1 [visualizza esempio completo]

Se non vengono specificate le dimensioni del controllo (come nel esempio 6.1) questo assume le dimensioni minime necessarie per contenere il testo, se il testo viene successivamente cambiato le dimensioni si adattano automaticamente a meno che venga specificato lo stile wxST_NO_AUTORESIZE.


immagine 6.1

torna ad inizio pagina



wxTextCtrl

wxTextCtrl permette di visualizzare del testo che può essere modificato, tagliato, copiato e incollato dall'utente.

01: ID_TXT = wxNewId()
02: txt1 = wxTextCtrl(dlg, ID_TXT, "Ciao",
03:                   wxPoint(5, 5))
04: EVT_TEXT(self, ID_TXT, self.OnText)
05:
06: # Questo controllo non può essere modificato.
07: txt2 = wxTextCtrl(dlg, -1, "Sola lettura",
08:                   wxPoint(5, 35),
09:                   style=wxTE_READONLY)
10: # La capacità di essere modificato può anche
11: # essere cambiata dopo la creazione del controllo
12: # con il metodo SetEditable(editable), quindi
13: # l'istruzione precedente è equivalente a:
14: # txt2 = wxTextCtrl(dlg, -1, "Sola lettura",
15: #                  wxPoint(5, 35))
16: # txt2.SetEditable(0)
17:
18: # In questo vengono mostrati solo asterischi
19: # per nascondere una password
20: txt3 = wxTextCtrl(dlg, -1, "Password",
21:                   wxPoint(5, 65),
22:                   style=wxTE_PASSWORD)
23:
24: # In quest'altro vengono visualizzate più
25: # righe contemporaneamente
26: txt4 = wxTextCtrl(dlg, -1, "Testo di prova",
27:                   wxPoint(5, 95),
28:                   style=wxTE_MULTILINE)
29: # modifica il testo, similmente si può ottenere
30: # il testo con il metodo GetValue()
31: txt4.SetValue("Ciao\nmondo!")
esempio 6.2 [visualizza esempio completo]

Il controllo offre altri metodi per ottenere o impostare il testo, ad esempio GetLineText (per ottenere il testo di una singola riga) o LoadFile(per caricare un file di testo), che però non verranno trattate qui.
È ovviamente possibile associare alla modifica del testo nel controllo una funzione come vediamo alla linea 4, un'altra funzione helper che può risultare utile è EVT_TEXT_ENTER che serve a richiamare una funzione ogni volta che viene premuto il tasto INVIO in un controllo di testo ad una linea sola.
Alla linea 31 viene impostato il testo del controllo, con i wxTextCtrl è meglio utilizzare questa funzione invece del metodo SetLabel di wxControl.


immagine 6.2

torna ad inizio pagina



wxButton e wxBitmapButton

Un elemento molto comune di ogni interfaccia grafica sono i pulsanti, rappresentati in wxPython dalla classe wxButton.

01: ID_BTN = wxNewId()
02: btn = wxButton(dlg, ID_BTN, "Premimi!")
03: EVT_BUTTON(self, ID_BTN, self.OnClick)
esempio 6.3 [visualizza esempio completo]

Come si vede alla linea 2 la creazione di un pulsante è molto semplice, il costruttore accetta i soliti parametri: finestra genitore, id, titolo. Attraverso la funzione EVT_BUTTON (linea 3) viene associata la funzione self.OnClick alla pressione del pulsante.


immagine 6.3



01: ID_BMP_BTN = wxNewId()
02: # L'immagine viene caricata in memoria
03: bmp = wxBitmap("immagine.bmp", wxBITMAP_TYPE_BMP)
04: wxBitmapButton(dlg, ID_BMP_BTN, bmp)
05: EVT_BUTTON(self, ID_BMP_BTN, self.OnClick)
esempio 6.4 [visualizza esempio completo]

Analoga è la creazione di un pulsante che contiene una bitmap, ma invece di passare al costruttore il testo del pulsante viene passata l'immagine rappresentata in wxPython dalla classe wxBitmap. Appena si fa partire lo script si nota però che lo sfondo del pulsante è viola e non grigio, il problema si può risolvere attraverso l'uso di wxMask come verrà spiegato in un capitolo successivo. Altri metodi utili di wxBitmapButton sono SetBitmapDisabled e SetBitmapSelected che accettano un argomento che specifica l'immagine da visualizzare quando il pulsante è rispettivamente disabilitato e selezionato.


immagine 6.4

torna ad inizio pagina



wxCheckBox

I check box sono dei particolari pulsanti che contengono una casella quandrata che, se selezionata, contiene un segno di spunta.

01: ID_CB1 = wxNewId()
02: ID_CB2 = wxNewId()
03: cb1 = wxCheckBox(dlg, ID_CB1, "Check box 1", wxPoint(10, 10))
04: cb2 = wxCheckBox(dlg, ID_CB2, "Check box 2", wxPoint(10, 40))
05: EVT_CHECKBOX(self, ID_CB1, self.OnEvtCheckBox)
06: EVT_CHECKBOX(self, ID_CB2, self.OnEvtCheckBox)
esempio 6.5 [visualizza esempio completo]

La creazione di un check box è uguale alla crazione di un pulsante; la funzione EVT_CHECKBOX associa la selezione/deselezione del controllo alla funzione self.OnEvtCheckBox.
Per sapere se un check box è selezionato si può utilizzare il metodo GetValue() che restituisce true se il controllo è selezionato, il valore può essere impostato con SetValue(). Lo stato del check box può anche essere ottenuto con il metodo Checked() dell'oggetto event passato a self.OnEvtCheckBox.


immagine 6.5

torna ad inizio pagina



wxRadioBox e wxRadioButton

I radio button sono simili ai check box ma permettono la selezione di un solo elemento per volta, per questo vengono usati quando non ha senso permettere che due valori. I radio box sono invece dei "contenitori" per radio button.

01: ID_RBOX = wxNewId()
02: rb = wxRadioBox(dlg, ID_RBOX, "Scegli:",
03:                 choices=["ciao", "mondo", "!"])
04: EVT_RADIOBOX(self, ID_RBOX, self.OnEvtRadio)
05: # imposta la selezione al SECONDO pulsante,
06: # l'indice parte da zero!
07: rb.SetSelection(1)
esempio 6.6 [visualizza esempio completo]

La creazione dei radio button non presenta nessuna novità eccetto il parametro choices del costruttore (linea 3) che è una lista contenente i testi dei radio button (viene creato un radio button per ogni elemento di choices).
Altri metodi interessanti sono SetSelection (linea 7) e GetSelection che permettono rispettivamente di impostare ed ottenere l'indice del controllo selezionato. È importante notare che chiamando SetSelection non viene generato l'evento che chiama la funzione OnEvtRadio.


immagine 6.6

In alcuni casi può servire avere dei radio button senza la cornice dei radio box, è quindi possibile creare direttamente un'istanza di wxRadioButton.

01: # Primo gruppo
02: wxRadioButton(dlg, 100, "1", pos=(10, 10), style=wxRB_GROUP)
03: wxRadioButton(dlg, 101, "2", pos=(10, 40), style=0)
04: # Secondo gruppo
05: wxRadioButton(dlg, 102, "3", pos=(10, 70), style=wxRB_GROUP)
06: wxRadioButton(dlg, 103, "4", pos=(10, 100), style=0)
esempio 6.7 [visualizza esempio completo]

Per avere più gruppi di radio button il cui stato è indipendente è necessario specificare wxRB_GROUP come stile ad ogni primo radio button di un gruppo, quindi nell'esempio 6.7 il primo radio button inizia un gruppo di cui fa parte anche il secondo radio button, un altro gruppo (a cui appartiene anche il quarto) è iniziato dal terzo radio button.
torna ad inizio pagina