dal 2015 - visita n. 1073
wxPython
wxPython

 
 Introduzione   wxPython    Editor    Documentazione  

L'Interfaccia Grafica Utente, nota anche come GUI (dall'inglese Graphical User Interface), consente di interagire con il computer in maniera molto semplice, attraverso la manipolazione grafica di oggetti (icone, pulsanti, finestre, etc.) presentati sullo schermo.
Con la classica Interfaccia a Riga di Comando, nota anche come CLI (dall'inglese Command Line Interface), invece, l'esecuzione del programma viene guidata da istruzioni o comandi impartiti dall'utente tramite la tastiera.

Sono due modalità di utilizzo apparentemente agli antipodi, ma non per il programmatore. La maggior parte dei linguaggi, infatti, nasce con l'interfaccia CLI e Python non fa eccezione. Spesso una prima soluzione software viene frettolosamente scritta con l'interfaccia CLI, ma arriva presto il momento per il programmatore, specialmente quando il frutto del proprio lavoro deve essere affidato a mani estranee, di rivestire il software sviluppato con una grafica accattivante ed una rinnovata semplicità d'uso.

Questo modo di comportarsi è molto frequente, specialmente in ambito Linux in cui la shell grafica costituisce uno strato posto al di sopra della shell testuale, non la sostituisce, ed è nettamente separata da essa.

Può risultare di una qualche utilità mettere a confronto i vantaggi e gli svantaggi dell'interfaccia CLI rispetto all'interfaccia GUI. La tabella seguente ha lo scopo di sintetizzare i punti di forza e le difficoltà d'uso di ciascuna delle due interfacce.

 CLIGUI
Facilità I nuovi utenti incontrano molte difficolta' ad utilizzare la linea di comando a causa della necessita' di conoscere e memorizzare i nomi dei vari comandi e di utilizzare la sintassi corretta per comporre il comando stesso.Benche' i nuovi utenti, talvolta, possano avere delle difficoltaà iniziali ad interagire con l'interfaccia grafica, la velocita' di apprendimento è sicuramente più elevata in confronto alla linea di comando.
Controllo Gli utenti hanno un maggior controllo sul file-system e sul sistema operativo nel suo complesso. Per esempio e' possibile con un solo comando copiare facilmente un file da una locazione all'altra. Benche' un interfaccia grafica offra abbastanza controllo sul file system e sul sistema operativo, spesso, gli utenti piu' esperti o quelli che hanno bisogno di un compito specifico potrebbero dover ricorrere alla riga di comando per completare una specifica operazione.
Multitask Sebbene ci siano alcuni ambienti a linea di comando in grado di gestire il multitask, questi non offrono pero' la stessa facilita' nel mostrare sullo schermo cose diverse nello stesso momento.Gli utenti GUI dispongono delle finestre che consentono di vedere facilmente, controllare e gestire diversi lavori contemporaneamente, e cio' avviene molto piu' rapidamente rispetto alla linea di comando.
Velocità Poiche' gli utenti a riga di comando hanno solo bisogno di utilizzare la tastiera per operare, spesso eseguendo soltanto alcune righe riescono a svolgere un compito complesso in maniera piu' veloce di quanto non possa fare un utente GUI, anche esperto. La GUI e' molto facile da usare grazie al mouse. Tuttavia dovendo utilizzare sia il mouse sia la tastiera per portare a compimento alcune operazioni per il controllo del sistema operativo si finisce per essere piu' lenti di un operatore che utilizza soltanto la tastiera.
Risorse Un sistema che utilizza soltanto la linea di comando richiede una piccolissima parte delle risorse del computer.Una GUI richiede molte risorse di sistema per ognuno degli elementi che deve caricare: icone, fonts, cursore, finestre, etc. Inoltre i vari driver che devono essere caricati (video, mouse, ed altri) richiedono ulteriori risorse.
Script L'interfaccia a linea di comando consente all'utente di scrivere facilmente sequenze di comandi per svolgere complessi lavori ripetitivi o compilazioni di programmi con molti moduli.Benche' tramite la GUI sia possibile utilizzare delle scorciatoie per eseguire delle azioni di completamento di un lavoro o l'esecuzione di un programma, queste sono nulla in confronto all'immediatezza della linea di comando.
Accesso Remoto Spesso quando si accede a un altro computer o a un dispositivo connesso in rete l'utente sara' in grado di manipolare il dispositivo o i suoi file soltanto tramite la riga di comando o CLIRecentemente l'accesso in remoto in modalita' grafica sta diventanto sempre piu' popolare. Ma non sempre tutti i computer della rete e/o non tutti i dispositivi di rete hanno questa possibilita'.

Nei sistemi operativi moderni l'interfaccia grafica è basata sulla metafora di un piano di lavoro, rappresentato dallo schermo (scrivania o desktop), con le varie icone che possono indicare cartelle, applicazioni, ed altro.
Oggi tutti i sistemi operativi diffusi nei vari settori (notebook, tablet, telefonia) sono dotati di una GUI che opera secondo gli stessi principi di quella originariamente studiata dalla Xerox. Ciò ha causato una fortissima evoluzione nell'interazione tra computer e utente: grazie all'interfaccia grafica è possibile compiere molti compiti comuni e complessi senza il bisogno di un'approfondita conoscenza del funzionamento del computer.

Sicuramente la caratteristica principale dell'interfaccia grafica, che più attrae il programmatore, è quella di potere sviluppare facilmente software guidato dagli eventi.


Modello ad eventi con ascoltatori (listeners)

Questo modello parte dal presupposto che sia l'utente a decidere il percorso che l'esecuzione del programma dovrà seguire. All'utente sono resi disponibili diversi widget (oggetti-finestra), ognuno dei quali attiva su richiesta l'esecuzione di determinate parti del programma. L'interazione tra utente e oggetti grafici avviene tramite i normali dispositivi di input: tastiera, mouse, touchpad, touchscreen.

Il caso più semplice è quello di un pulsante come quello rappresentato in figura. Al pulsante sono associati zero o più ascoltatori (listeners), cioè entità di programma ad ognuno dei quali è associata, a sua volta, una determinata sequenza di istruzioni. In fase di esecuzione, ogni volta che l'utente compie l'azione di attivare il pulsante, quest'ultimo riceverà una notifica dal sistema operativo ed attiverà tutti i listeners ad esso associati. Si dice, allora, che il componente grafico genera un evento che viene notificato ai listeners.

Il modo in cui i listeners sono realizzati nello specifico varia a seconda del linguaggio e della libreria grafica in uso. Ad esempio, possono essere funzioni individuate tramite puntatori, oppure oggetti che espongono determinati metodi standard, e così via.

L'ambiente grafico nativo per Python dovrebbe essere Tkinter, ma sicuramente questo non rappresenta il meglio in termini di qualità dei risultati.
Le alternative possibili sono tante: qtPython, gtkPython, wxPython, pyglet, glade, pySide, ed altre ancora. Sono tutte caratterizzate dai loro punti a favore e dai loro punti contro. Dopo averne analizzato alcuni esempi base, la mia scelta è caduta su wxPython, forse per una apparente migliore linearità di impostazione e di scrittura, ma in ogni caso dovevo pur cominciare da qualche parte, e non mi sono posto troppi condizionamenti iniziali. Non mi va assolutamente di entrare in una diatriba sull'opportunità di usare questo o quello. Chi è interessato a wxPython spero possa trovare degli spunti interessanti in questo mio personale percorso formativo.

Come afferma il sito ufficiale www.wxpython.org, nella sua parte introduttiva, il toolkit è stato progettato per essere cross-platform, ossia lo stesso programma può funzionare su piattaforme diverse senza la necessità di essere modificato. Attualmente vengono supportate le piattaforme di Linux, Windows, Mac-OSX. In figura, la stessa applicazione come si presenta sui tre sistemi operativi.

  
LinuxWindows 7Mac OS X


L'ambiente di lavoro utilizzato per queste esercitazioni è un computer con installato Linux Debian 8.6, con interfaccia grafica Xfce 4.10, interprete Python 2.7.9, toolkit wxPython 3.0.1.1. Ma certamente, qualunque altra distribuzione Linux con il necessario ambiente per Python e wxPython potrà essere utilizzata per replicare le esercitazioni.

Anche se il percorso didattico viene sviluppato in ambiente Linux, la gran parte delle cose che verranno trattate sarà utilizzabile anche in ambienti Windows e Mac. L'importante è predisporre bene, fin dall'inizio, un ambiente di sviluppo per Python e wxPython adeguato alla piattaforma usata.

Non mi sembra il caso di richiamare l'uso della riga di comando per i programmatori Linux, mentre è opportuno ricordare che la shell di Python si attiva con il comando:

idle &

e che si presenta con il seguente aspetto:


rendendo operative due modalità di lavoro:

  1. interattiva: per provare, all'interno della shell, singole istruzioni o brevi sequenze di istruzioni.
  2. sviluppo: per scrivere/modificare, tramite i comandi della barra dei menù e l'editor interno, programmi completi, che si possono far funzionare con il comodo tasto F5.

Nonostante con la seconda modalità di idle sia possibile sviluppare semplici applicazioni, come scelta personale, preferisco lavorare invece con l'editor Geany ed il terminale per l'avvio dei programmi. Questo mi consente di controllare direttamente qualunque fase del processo di sviluppo.
Naturalmente è possibile utilizzare altri editor, uno per tutti Editra che è un IDE (ambiente di sviluppo integrato) abbastanza completo, scritto proprio in wxPython da Cody Precord. E' diventato un po' l'editor ufficiale di wxPython, e quindi si trova incluso nelle distribuzioni scaricate, anche se la visita del sito consente di avere la versione più aggiornata e di scaricare i plugin ed altro materiale utile.
Entrambi gli editor citati sono multipiattaforma e quindi è possibile scaricare la versione adatta al proprio sistema operativo.

Qualunque sia la scelta dell'editor, data la complessità di wxPython, sarebbe opportuno che tale strumento abbia almeno le caratteristiche seguenti:

Oggi tutti gli editor moderni hanno queste caratteristiche, la scelta è un fattore personale, ma non sempre è necessario utilizzare un bazooka come Eclipse, spesso è più agevole una pistola, e c'è chi si accontenta anche di una fionda.

Il sito ufficiale wxPython costituisce il punto di partenza per chiunque inizi ad occuparsi di questo framework che è caratterizzato da una certa vastità e complessità, tutti elementi che, soprattutto all'inizio, creano disorientamento e frustrazione. A questo si aggiunge anche la fatica linguistica, se non si ha la giusta pratica con l'inglese, ma per chi vuole programmare non si può prescindere da questa conoscenza divenuta ormai indispensabile.

Per chi ama un approccio diretto con la pratica, il primo posto dove conviene guardare è la demo, un pacchetto che si scarica e si installa a parte, sempre dal sito di wxPython. In ciascun esempio è possibile vedere oltre al codice sorgente anche delle utili annotazioni. Con un simile avvio ci si imbatte, però, in due ordini di problemi:

Nel caso della versione installata ed usata per questi appunti, wxPython-3.0.2.0, la demo è strutturata su 2 cartelle principali:

Per chi ama, invece, iniziare con della documentazione classica è possibile consultare online le descrizioni delle API di wxPython sul sito ufficiale www.wxpython.org/docs/api.
In aggiunta, anche se un po' datata ed incompleta, si può dare un occhiata anche alla raccolta di note mantenuta da Andrea Gavana wxPython/APIMain.html.

La documentazione sulle API è importante, ma serve dopo aver compreso come muoversi all'interno del framework.

Un altro riferimento online è costituito da wiki.wxpython.org, che, pur non essendo un manuale nel senso classico, presenta tuttavia degli esempi interessanti ed è scritto molto bene e costantemente aggiornato.


Poichè wxPython è il porting per Python del framework wxWidgets per C++, può essere utile consultare la documentazione delle API di wxWidgets che è molto completa e ricca. La si può trovare online in docs.wxwidgets.org/stable.

Come dovrebbe risultare ovvio, tutta la sintassi, gli esempi e le convenzioni tipografiche, in questo caso, si riferiscono al mondo C++, ma con qualche accorgimento ed un po' di allenamento e pazienza è possibile adattare gli esempi al mondo python. In alcune situazioni tale documentazione potrebbe costituire una risorsa preziosa perchè, al suo interno, si trovano delle note specifiche per wxPython in quei punti in cui le API differiscono in modo sostanziale.


Un ultimo suggerimento, quando programmate non dimenticate di tenere sempre una shell aperta. Quando c'è qualche dubbio ricordatevi di usare la funzione dir per avere subito l'elenco dei metodi disponibili per un determinato widget.

Ecco come fare nel caso di wx.TextCtrl:

>>> import wx
>>> [i for i in dir(wx.TextCtrl) if 'Background' in i]

e questo sarà il risultato della richiesta relativa a wx.TextCtrl, con l'elenco dei metodi che, in qualche modo, riguardano lo sfondo.

['BackgroundColour', 'BackgroundStyle', 'ClearBackground', 'GetBackgroundColour', 
'GetBackgroundStyle', 'HasTransparentBackground', 'InheritsBackgroundColour', 
'SetBackgroundColour', 'SetBackgroundStyle', 'SetOwnBackgroundColour']
>>> 


















Introduzione
Panoramica
wx.Frame
Menu
Toolbar
Layout
Eventi
Dialoghi
Widgets-A
Widgets-B



Quel che cerca l'uomo superiore è in lui stesso; quel che cerca l'uomo dappoco è negli altri.
Confucio (551-479 a.C.)

Valid CSS!
pagina generata in 0.001 secondi