PyQt4: un tutorial facile facile

Python e qt4 sono un binomio vincente che permette a tutti di realizzare velocemente applicazioni con un accattivante interfaccia grafica. Vediamo come!

Nel corso del mio lavoro di scienziato mi e' capitato di dover sviluppare interfaccie grafiche a programmi scritti da me o da qualcun altro. La prima che sviluppai fu in IDL (per dirla all'ammericana... a pain in the 455!)
Poi mi sono avvicinato alle librerie wx, attratto dalla loro portabilita' e dal fatto di poterle utilizzare con Python. Programmare con le wx mi ha dato parecchie soddisfazioni, ma mai quanto programmare con PyQt4!

Come si fa?
Ora vi mostro come essere operativi da subito!
Realizzeremo un software minimale, in grado di accettare parametri di input e rielaborarli, presentando il risultato ottenuto all'utente!
Posto che le librerie siano installate, aprite qt4 designer:
/usr/lib/qt4/bin/designer # per mandriva
Se designer vi apre una marea di finestre e non vi piace potete usare la modalita' "docked windows" (si setta da un dialogo che si apre dal menu' della finestra principale: "Edit->Preferences...").

A questo punto create un nuovo Form dal menu' file. Per questo tutorial scegliamo la strada della comodita': scegliete "Dialog with buttons: bottom" (vedi Fig. 1)!
Fig.1: Cominciamo da qualcosa di gia' preimpostato
Se tutto e' andato bene dovreste avere qualcosa di simile a quanto mostrato in figura 2... Ora siete pronti a lavorare sul serio!
Fig. 2: L'ambiente di lavoro e' pronto!
Come vedete a sinistra ci sono elementi per creare la parte grafica della nostra applicazione. Mettiamone uno per l'input (il LineEdit) e uno per l'output, un text browser (Fig. 3):
Fig. 3: Inseriamo widget per l'input e l'output
Come vedete fa schifo! Ma non e' un problema! Basta
cliccare su una parte vuota del dialog e poi sul bottone "Lay Out Vertically"... Gia' questo e' sufficiente per ottenere un risultato piu' che gradevole (Fig.4)!
Fig. 4: l'interfacia e' pronta!
Salvatelo in una directory che vi piace con il nome di "myGui.ui" (o quello che vi pare...).
Bene! La parte grafica e' finita... anche se di Python, per ora, non c'e' neanche l'ombra!!!

Comincia la pythonificazione!!!!!
Ora dovrete trasformare la vostra applicazione in codice Python. Facilissimo, basta usare il comando:
pyuic4 myGui.ui -o myGui.py
e siete a posto! Se non trovate pyuic4 probabilmente dovrete installare le librerie di sviluppo di qt4 (per mandriva urpmi python-qt4-devel).
Ora create un altro file chiamato myApp.py, che vi servira' per usare la GUI e per farle fare qualcosa di interessante.

Il motivo per cui e' comodo usare due file e' che se volete potete modificare la GUI con designer e poi riconvertirla in codice Python senza preoccuparvi di perdere del codice!

Nel file metteci questo codice:
#!/usr/bin/env python
from myGui import * # Importa la parte grafica

# La funzione che fa girare il programma
app = QtGui.QApplication([]) # Crea un'applicazione Qt, ...
Dialog = QtGui.QDialog() # ... un dialogo, ...
ui = Ui_Dialog() # ... e una user interface.
ui.setupUi(Dialog) # Infila il dialog nella user interface

def run():
Dialog.show() # mostra il dialog precedentemente creato
return app.exec_() # esegue l'applicazione ed esce dal
# programma ritornando lo stesso intero che ritorna app.exec_()

if __name__ == "__main__":
run()
Il comando python myApp.py gia' dovrebbe presentarvi la vostra interfaccia, perfettamente funzionante: se cliccate sui pulsanti si chiudera'! E cosa doveva fare di piu'?!

Facciamo fare qualcosa di utile alla nostra applicazione!
Effettivamente il programma non e' stato istruito sulle azioni da compiere. La cosa piu' stupida che mi viene in mente e' copiare quello che mettiamo in input, rielaborarlo, e presentarlo come output. Modificate il codice come mostrato aggiungendo le righe in rosso.
#!/usr/bin/env python
from myGui import * # Importa la parte grafica

# La funzione che fa girare il programma
app = QtGui.QApplication([]) # Crea un'applicazione Qt, ...
Dialog = QtGui.QDialog() # ... un dialogo, ...
ui = Ui_Dialog() # ... e una user interface.
ui.setupUi(Dialog) # Infila il dialog nella user interface

# Reimpostiamo la gestione del bottone Ok
def action():
"""Quando Ok viene premuto ricopia il testo in grassetto nel textbrowser"""
ui.textBrowser.setText("%s" % ui.lineEdit.text())

app.disconnect(ui.buttonBox,QtCore.SIGNAL("accepted()"),Dialog.accept)
app.connect(ui.buttonBox,QtCore.SIGNAL("accepted()"),action)

def run():
Dialog.show() # mostra il dialog precedentemente creato
return app.exec_() # esegue l'applicazione ed esce dal
# programma ritornando lo stesso codice che ritorna app.exec_()

if __name__ == "__main__":
run()
Le righe in piu' ridefiniscono il comportamento del bottone Ok, facendogli eseguire il codice nella funzione "action".
Facile no!
Adesso e' compito vostro far fare ai vostri programmi qualcosa di utile per voi e il modo della comunita' open source!

Se avete dubbi o suggerimenti per migliorare questo micro tutorial vi prego di contattarmi!

2 commenti:

Unknown ha detto...

E se uno fosse interessato al contrario da .py a .ui?

Ma da qualche parte nel mondo c'è come scrivere Dialog in PyQT4 a manina?

Anonimo ha detto...

Onestamente, fa proprio schifo questa guida.