skip to navigation
skip to content

FAQ sull'interfaccia grafica

Date: 2007-06-28
Version: 10910
Web site:http://www.python.org/
Traduzione:Meo Bogliolo 18 Marzo 2006

Traduzione Italiana

Questo documento, di pubblico dominio, e' stato tradotto da Meo Bogliolo e revisionato da Antonio Vitale: potete contattarli per qualsiasi commento o correzione.

1   Domande generali

1.1   Quali toolkit grafici indipendenti dalla piattaforma esistono per Python?

A seconda delle piattaforme di vostro interesse ve ne sono diversi.

1.1.1   Tkinter

Il rilascio standard di Python comprende un'interfaccia orientata agli oggetti per i widget Tcl/Tk, che viene chiamata Tkinter. E' probabilmente la piu' semplice da installare ed utilizzare. Per maggiori informazioni su Tk, compresi i puntatori ai sorgenti, si puo' vedere la home page di Tcl/Tk su http://www.tcl.tk. Tcl/Tk e' completamente portabile sulle piattaforme MacOS, Windows e Unix.

1.1.2   wxWindows

wxWindows è una libreria di classi grafiche scritta in C++ che e' un'interfaccia portabile verso varie librerie specifiche di piattaforma; wxPython è un'interfaccia Python a wxWindows. wxWindows supporta Windows e MacOS, su Unix supporta sia i toolkit GTk+ che Motif. wxWindows conserva l'aspetto dei sottostanti toolkit grafici richiamati, e comprende un ricco insieme di widget ed un'ampia collezioni di classi GDI. Si veda, per maggiori dettagli, the wxWindows page.

wxPython [il sito e' ridiretto su http://wxpython.org NdT] è un modulo di estensione che ricopre molte delle classi C++ di wxWindows e che sta rapidamente acquistando popolarità tra i programmatori Python. wxPython puo' essere scaricato dalla distribuzione sorgente o CVS di wxWindows, oppure direttamente dalla sua home page.

1.1.3   Qt

Sono disponibili i collegamenti PyQt per il toolkit Qt (PyQt) e PyKDE per KDE. Se si scrive un programma opensource non si deve pagare per Qt alcuna licenza, ma se si sta sviluppando un'applicazione di cui si vogliono conservare i diritti, è necessario acquistare una licenza di PyQt da Riverbank Computing ed una licenza di Qt da Trolltech.

1.1.4   GTk+

I collegamenti per il PyGTk GTk+ toolkit sono stati sviluppati da James Henstridge; si veda ftp://ftp.gtk.org/pub/gtk/python/.

1.1.5   FLTK

I collegamenti Python per the FLTK toolkit, un semplice ma potente e maturo sistema a finestre inter-piattaforma sono disponibili presso il the PyFLTK project.

1.1.6   FOX

E' disponibile un wrapper per the FOX toolkit chiamato FXpy. FOX supporta sia Unix che Windows.

1.1.7   OpenGL

Per i collegamenti a OpenGL si veda PyOpenGL.

1.2   What platform-specific GUI toolkits exist for Python?

The Mac port di Jack Jansen ha un ricco e sempre crescente insieme di moduli che supportano le chiamate native al toolbox Mac. Tale porting include il supporto per le librerie MacOS9 e MacOS X Carbon. Installando il PyObjc Objective-C bridge, i programmi Python possono utilizzare le librerie MacOS X Cocoa. Si veda la documentazione fornita assieme al porting Mac.

Pythonwin di Mark Hammond comprende un'interfaccia alle Microsoft Foundation Classes ed un ambiente di programmazione Python che la utilizza, scritto principalmente in Python stesso.

2   Domande su Tkinter

2.1   Come posso freezare un'applicazione Tkinter?

Freeze e' uno strumento per creare applicazioni stand-alone. Quando si effettua un freeze di un'applicazione Tkinker il risultato non è una vera e propria applicazione stand-alone poiche' per funzionare necessita ancora delle librerie Tcl e Tk.

Una soluzione e' quella di distribuire l'applicazione con le librerie tcl e tk e puntare a queste a livello di run-time impiegando le variabili d'ambiente TCL_LIBRARY e TK_LIBRARY.

Per ottenere una vera applicazione stand-alone debbono essere integrati nell'applicazione anche gli script Tcl che costituiscono la libreria. Uno strumento che consente questo è SAM (stand-alone modules): fa parte della distribuzione Tix (http://tix.mne.com) [il sito non sembra piu' attivo ma ho trovato il Tix Widget Set for Tk/Tcl and Python su SourceForge NdT]. L'applicazione stand-alone si ottiene compilando Tix con il SAM abilitato, effettuando le corrette chiamate a Tclsam_init etc nei moduli Python/tkappinit.c, e collegando con le libtclsam e libtksam (debbono essere incluse anche le librerie Tix).

2.2   Si possono gestire eventi Tk mentre si aspetta per l'I/O?

Si, e non c'e' neanche bisogno di utilizzare i thread! Ma bisogna cambiare un poco il codice per l'I/O. Tk possiede l'equivalente della chiamata Xt XtAddInput() che consente di registrare una funzione di callback che verra' chiamata dal mainloop Tk mentre l'I/O è effettuto su un file descriptor. Ecco quello che serve:

from Tkinter import tkinter
tkinter.createfilehandler(file, mask, callback)

Il file puo' essere sia un file Python, sia un oggetto socket (attualmente qualunque oggetto avente un metodo fileno()), che un normale numero intero di file descriptor. mask deve essere una delle costanti tkinter.READABLE o tkinter.WRITABLE. La funzione di callback e' chiamata come nell'esempio seguente:

callback(file, mask)

La funzione di callback deve essere deregistrata al termine, mediante:

tkinter.deletefilehandler(file)

Nota: poiche' non e' possibile sapere quanti byte sono disponibili per la lettura non è possibile utilizzare i metodi read o readline di un oggetto file Python perche' questi richiedono di specificare un numero predefinito di byte. Con i sockets, i metodi recv() oppure recvfrom() operano correttamente; per gli altri file basta usare os.read(file.fileno(), maxbytecount).

2.3   Le assegnazioni dei tasti non funzionano con Tkinter: perche'?

Un problema molto comune è che i gestori di eventi registrati con il metodo bind() non vengano eseguiti quando viene premuto il tasto corrispondente.

La piu' comune causa e' che il widget a cui sono registrati i bind() non ha il "keyboard focus". è opportunto controllare la documentazione PyTk sul comando focus. Tipicamente il focus viene assegnato ad un widget quando si clicca su di esso (ma questo non avviene per le label; si veda l'opzione takefocus).