Introduzione

Ritorna all'Indice

Questo capitolo spiega cos'è PyQt e mostra alcuni esempi di codice commentato.

Cos'è PyQt?

Ebbene, è un toolkit per creare interfacce grafiche.
Questo toolkit è implementato come un insieme di moduli Python messi a disposizione dei programmatori dando la possibilità di accedere direttamente alle classi QT, le librerie grafiche su cui è basato PyQt.
La prima release di PyQt risale al 1998, grazie a Phil Thompson che ancora oggi porta avanti il progetto con la sua compagnia Riverbank Computing.
Ha la stessa licenza delle Qt, ovvero sia GPL sia commerciale. Facendo ciò cercano infatti di spronare gli sviluppatori a rilasciare il software open source.
Cosa molto importante da dire è che PyQt è multipiattaforma, per cui funziona sia sui sistemi Unix sia su quelli Windows e Mac.

I vantaggi che ha PyQt rispetto all'utilizzo delle librerie Qt in C++ sono la maggiore leggibilità ma soprattutto ciò che conta è la maggiore produttività: il codice Python risulterà il 40-50% in meno di quello scritto in C++ (e ciò conta molto!), quindi il programmatore sicuramente avrà meno problemi a scovare bug e allo stesso tempo scriverà più codice e finirà prima un lavoro.

Moduli PyQt

Tuttavia PyQt è così grande che è stato diviso in vari moduli, i cui nomi indicano il criterio con cui sono stati divisi:

Introduzione?action=AttachFile&do=get&target=qt_mods

PyQt è multipiattaforma!

Ebbene, sì! PyQt è multipiattaforma: funziona sia sui sistemi operativi Linux sia Windows sia Mac!
Per prima cosa quindi installiamo PyQt sul nostro sistema operativo e controlliamo che funzioni, digitando da una console qualsiasi:

   1 from PyQt4.QtGui import *
   2 import sys
   3 app = QApplication(sys.argv)
   4 button = QPushButton('Schiacciami!')
   5 button.show()

Se l'interprete darà errori, allora bisognerà controllare che non ci siano stati errori nell'installazione o che sia installato PyQt4.
Altrimenti dovremmo trovarci con un bottone con su scritto "Schiacciami"

Un Semplice Esempio

Di seguito viene riportato un semplice esempio per mostrare come può essere utilizzato PyQt.
Questa è una semplice finestra di dialogo che chiede all'utente se desidera uscire quando viene premuto il tasto per l'uscita (la X)

   1 #!/usr/bin/python
   2 
   3 # messagebox.pyw
   4 
   5 import sys
   6 from PyQt4 import QtGui
   7 
   8 
   9 class MessageBox(QtGui.QWidget):
  10     def __init__(self, parent=None):
  11         QtGui.QWidget.__init__(self, parent)
  12 
  13         self.setGeometry(300, 300, 250, 150)
  14         self.setWindowTitle('message box')
  15 
  16 
  17     def closeEvent(self, event):
  18         reply = QtGui.QMessageBox.question(self, 'Messaggio',
  19             "Sicuro di voler uscire?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
  20 
  21         if reply == QtGui.QMessageBox.Yes:
  22             event.accept()
  23         else:
  24             event.ignore()
  25 
  26 app = QtGui.QApplication(sys.argv)
  27 qb = MessageBox()
  28 qb.show()
  29 sys.exit(app.exec_())

Ed ecco la nostra finestra di dialogo:

Introduzione?action=AttachFile&do=get&target=messagebox

{i} Le finestre di dialogo verranno spiegate meglio successivamente. Qui viene solo mostrato un esempio

Per gli utenti Windows e Mac OS X: vi consiglio di salvare il file con estensione .pyw perchè mentre in Windows è comodo perchè in tal modo richiama l'interprete pythonw.exe che evita di aprire la finestra del prompt dei comandi, in Mac OS X è essenziale .
In Linux è facoltativo, poichè basta definire il percorso dell'interprete (shebang iniziale #!) e renderlo eseguibile.

Passiamo ora alla spiegazione del codice.

Innanzitutto importiamo il modulo ''sys'' perchè dobbiamo accedere agli argomenti dati alla linea di comando, attravero sys.argv.
Poi importiamo QtGui, che come sappiamo è il modulo che presenta tutti i widget grafici.
Dopo creiamo la nostra classe MessageBox che eredita da QtGui.QWidget, la superclasse di ogni widget PyQt.
Attravero il metodo setGeometry impostiamo la grandezza della finestra: i primi due argomenti sono le posizioni x e y della finestra; il terzo e il quarto argomento sono rispettivamente la larghezza e l'altezza.
Cosa interessante di questo codice è l'aver effettuato un overriding (ridefinizione) del metodo ''closeEvent'' della superclasse QWidget.
{i} Vi ricordo che è molto importante conoscere come funzionano classi e oggetti per progettare GUI. Notare come sono strutturate le classi PyQt.

In pratica non abbiamo fatto altro che andare a pescare il metodo che viene chiamato quando l'utente dà un clic sulla x per la chiusura della finestra e l'abbiamo ridefinito (effettuato l'overriding) in modo che la finestra non si chiuda subito.
Dopo quel clic infatti compare una piccola finestra di dialogo che ci chiede se desideriamo chiudere realmente la finestra o no.
Ma vediamo come abbiamo modificato closeEvent:

   1     def closeEvent(self, event):
   2         reply = QtGui.QMessageBox.question(self, 'Messaggio',
   3             "Sicuro di voler uscire?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
   4 
   5         if reply == QtGui.QMessageBox.Yes:
   6             event.accept()
   7         else:
   8             event.ignore()

Innanzitutto prende un solo parametro, che in sostanza è l'evento di chiusura. reply è una finestra di dialogo che chiede la conferma per l'uscita, e in caso affermativo lancia il segnale accept() all'evento. In caso contrario gli invia ignore().

Infine inizializziamo gli oggetti. E' importante dire che ogni applicazione GUI PyQt deve avere un oggetto QApplication, che provvede all'accesso di molte informazioni, come la directory dell'applicazione, la risoluzione dello schermo, etc. Quando creiamo un oggetto QApplication gli dobbiamo passare gli argomenti della linea di comando perchè perchè PyQt ne riconosce alcuni come -geometry e -style.
Un'altra cosa molto importante da dire è che quando scegliamo di uscire, PyQt noterà che la finestra è stata nascosta all'utente che non può più riutilizzarla e subito fermerà l'esecuzione dellla GUI: ad esempio in PyGtk bisogna usare gtk.main_quit(), Qt invece rende il processo automatico.
Come facciamo a mettere in background l'applicazione, nonostante invisibile all'utente?
Ebbene, usando il metodo QApplication.setQuitOnLastWindowClosed(False).

L'introduzione termina qui, lasciando posto al capitolo sulle Dialogs.

Collegamenti Esterni

Vai alla pagina successiva: Dialogs


CategoryDocumentazione

PyQt4/Introduzione (last edited 2008-03-29 15:26:51 by Markon)