# FAQ interface graphique

Sommaire

- FAQ interface graphique

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

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

    - Tkinter

    - wxWidgets

    - Qt

    - Gtk+

    - Kivy

    - FLTK

    - OpenGL

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

  - Questions à propos de Tkinter

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

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

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

## 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).