FAQ interface graphique
***********************


Questions générales sur l'interface graphique
=============================================


Quelles bibliothèques d'interfaces graphiques multi-plateformes existent en Python ?
====================================================================================

Selon les plateformes que vous comptez utiliser, il en existe
plusieurs. Certaines ne sont cependant pas encore disponibles en
Python 3. A minima, Tkinter et Qt sont connus pour être compatibles
avec Python 3.


*Tkinter*
---------

Les versions standards de Python incluent une interface orientée objet
pour le jeu d'objets graphiques *Tcl/Tk*, appelée tkinter.  C'est
probablement la plus facile à installer (puisqu'elle est incluse avec
la plupart des distributions binaires de Python) et à utiliser. Pour
plus d'informations sur *Tk*, y compris les liens vers les sources,
voir la page d'accueil Tcl/Tk.  *Tcl/Tk* est entièrement portable sur
les plates-formes Mac OS X, Windows et Unix.


*wxWidgets*
-----------

*wxWidgets* (https://www.wxwidgets.org) est une librairie de classe
IUG portable et gratuite écrite en C++ qui fournit une apparence
native sur un certain nombre de plates-formes, elle est notamment en
version stable pour Windows, Mac OS X, GTK et X11.  Des clients sont
disponibles pour un certain nombre de langages, y compris Python,
Perl, Ruby, etc.

wxPython est le portage Python de *wxWidgets*. Bien qu’il soit
légèrement en retard sur les versions officielles de *wxWidgets*, il
offre également des fonctionnalités propres à Python qui ne sont pas
disponibles pour les clients d'autres langages. *WxPython* dispose de
plus, d’une communauté d’utilisateurs et de développeurs active.

*wxWidgets* et *wxPython* sont tous deux des logiciels libres, open
source, avec des licences permissives qui permettent leur utilisation
dans des produits commerciaux ainsi que dans des logiciels gratuits ou
contributifs (*shareware*).


*Qt*
----

Il existe des liens disponibles pour la boîte à outils *Qt* (en
utilisant soit PyQt ou PySide) et pour *KDE* (PyKDE4). *PyQt* est
actuellement plus mûre que *PySide*, mais*PyQt* nécessite d'acheter
une licence  de Riverbank Computing si vous voulez écrire des
applications propriétaires.  *PySide* est gratuit pour toutes les
applications.

*Qt >= 4.5* est sous licence LGPL ; de plus, des licences commerciales
sont disponibles auprès de The Qt Company.


*Gtk+*
------

Les GObject introspection bindings pour Python vous permettent
d'écrire des applications GTK+ 3.  Il y a aussi un tutoriel Python
GTK+ 3.

Les anciennes versions de *PyGtk* pour le Gtk+ 2 toolkit ont été
implémentées par James Henstridge ; voir <http://www.pygtk.org>.


*Kivy*
------

*Kivy* est une bibliothèque GUI multi-plateformes disponible à la fois
sur les systèmes d'exploitation de bureau (Windows, MacOS, Linux) et
les appareils mobiles (Android, iOS).  Elle est écrite en Python et
Cython, et peut utiliser une série de fenêtres de *backends*.

*Kivy* est un logiciel libre et open source distribué sous licence
MIT.


*FLTK*
------

Les liaisons Python pour the FLTK toolkit, un système de fenêtrage
multi-plateformes simple mais puissant et mûr, sont disponibles auprès
de the PyFLTK project.


*OpenGL*
--------

Pour les clients OpenGL, voir PyOpenGL.


Quelles boîtes à outils IUG spécifiques à la plate-forme existent pour Python ?
===============================================================================

En installant le PyObjc Objective-C bridge, les programmes Python
peuvent utiliser les bibliothèques Cocoa de Mac OS X.

Pythonwin de Mark Hammond inclut une interface vers les classes
*Microsoft Foundation Classes* et un environnement de programmation
Python qui est écrit principalement en Python utilisant les classes
*MFC*.


Questions à propos de *Tkinter*
===============================


Comment puis-je geler (*freezer*) les applications *Tkinter* ?
--------------------------------------------------------------

*Freeze* est un outil pour créer des applications autonomes.  Lors du
*freezage* des applications Tkinter, les applications ne seront pas
vraiment autonomes, car l'application aura toujours besoin des
bibliothèques Tcl et Tk.

Une solution consiste à empaqueter les bibliothèques *Tcl* et *Tk*
dans l'application et de les retrouver à l'exécution en utilisant les
variables d'environnement "TCL_LIBRARY" et "TK_LIBRARY".

Pour obtenir des applications vraiment autonomes, les scripts *Tcl*
qui forment la bibliothèque doivent également être intégrés dans
l'application. Un outil supportant cela est *SAM* (modules autonomes),
qui fait partie de la distribution *Tix*
(http://tix.sourceforge.net/).

Compilez Tix avec SAM activé, exécutez l'appel approprié à
"Tclsam_init()", etc. dans le fichier "Modules/tkappinit.c" de Python,
et liez avec *libtclsam* et *libtksam* (il est également possible
d'inclure les bibliothèques *Tix*).


Puis-je modifier des événements *Tk* pendant l'écoute des *E/S* ?
-----------------------------------------------------------------

Sur d'autres plates-formes que Windows, oui, et vous n'avez même pas
besoin de fils d'exécution multiples !  Mais vous devrez restructurer
un peu votre code *E/S*.  *Tk* possède l'équivalent de l'appel
"XtAddInput()" de *Xt*, qui vous permet d'enregistrer une fonction de
*callback* qui sera appelée par la boucle principale *Tk* lorsque des
*E/S* sont disponibles sur un descripteur de fichier. Voir
Gestionnaires de fichiers.


Je n'arrive pas à faire fonctionner les raccourcis clavier dans *Tkinter* : pourquoi ?
--------------------------------------------------------------------------------------

Une raison récurrente est que les gestionnaires d’évènements liés à
des évènements avec la méthode "bind()" ne sont pas pris en charge
même lorsque la touche appropriée est activée.

La cause la plus fréquente est que l'objet graphique auquel s'applique
la liaison n'a pas de « focus clavier ».  Consultez la documentation
*Tk* pour la commande *focus*. Habituellement, un objet graphique
reçoit le focus du clavier en cliquant dessus (mais pas pour les
étiquettes ; voir l'option *takefocus*).
