Pour les interfaces graphiques, PyGTK ou PyQt4 ?
Quelle est votre expérience ? Vaut-il mieux ne pas faire d'IHM avec Python ?

Le , par dourouc05, Responsable Qt
Des GUI en Python, c'est avec...
Pour développer une application graphique avec Python, un certain choix est disponible : Tkinter, pyFltk, PyQt, PyQtk, PySide, wxPython... Certains vont même jusqu'à déconseiller l'utilisation de Python pour les interfaces graphiques, alors que d'autres sites disent le contraire, avec même de quoi sélectionner le framework graphique le plus adapté. Voici un retour d'expérience sur le choix d'un framework graphique pour une application Python. Fallait-il vraiment le faire en Python ?

Citation Envoyé par Christophe Kibleur
J'ai récemment eu une discussion avec Armin Ronacher (que j'admire beaucoup soit dit en passant), qui me demandait pourquoi je n'avais pas choisi PyGtk au lieu de PyQt4 pour coder PyK.

Selon lui, PyGtk est un bon toolkit, bien pensé dans son architecture. Je suis tout à fait d'accord là-dessus mais mon choix s'était fait suivant certains points :
  • J'ai adoré les démos fournies par Qt4, vraiment impressionnantes ;
  • Ma première interface graphique avait été réalisée il y a longtemps et se nommait TeXBases, avec Ruby + Gtk et j'en ai gardé des souvenirs cauchemardesques en ce qui concernait la doc de l'époque. Finalement, j'avais fini par la recoder en PyQt4 ;
  • J'ai découvert qu'il existait une alternative à Scintilla dans Qt4, celle-ci me permettrait de coder ma propre coloration syntaxique, mon folding, etc.; maintenant, avec du recul je peux vous affirmer que celle-ci est loin d'être au point (lenteur, incohérences, ). Bien sûr, je suis loin d'être un excellent codeur, mais même les bêtes de course sous Qt4 le disent et on voit plein de projets switcher d'un coup sous Scintilla tellement c'est abominable.
    Exemple : j'avais implémenté les numéros de ligne dans PyK. Résultat : affichage d'une lenteur inouie pour un fichier dépassant les 5 Ko ! Oui, on peut faire beaucoup de choses avec Qt4, mais pas ça (c'est faisable, mais toujours lent cependant en C++) ;
  • J'avais déjà réalisé reStInPeace et cela m'a aidé à coder PyK.

Cela ne signifie pas l'abandon de PyQt4 pour ma part, loin s'en faut ; mais j'ai envie d'aller voir ailleurs un petit moment... ne serait-ce que pour pouvoir étendre les capacités d'autres logiciels communs sous Linux (GEdit, Vim, etc.).

Alors aujourd'hui je me suis mis à glâner divers renseignements sur PyGtk, et surtout des liens nouveaux et peu connus. C'est fou comme Gtk a évolué, notamment avec Glade3 dont l'interface ne ressemble plus à TheGimp. Dire qu'il a fallu des projets auxiliaires comme Gazpacho pour ça saute aux yeux de tout le monde !

J'aurai aussi certaines critiques à faire sur Gtk en général sur le peu que j'ai vu :
  • Glade 3, c'est bien, mais placer par défaut un GtkWindow en mode invisible me paraît vraiment complètement débile ;
  • Certains widgets ne sont pas dans Glade 3 (GtkSourceView, GtkHTML, etc.) ;
  • Fautes de frappe dans Devhelp qui font perdre du temps. Exemple : set_tabs_width au lieu de set_tab_width.
Avez-vous déjà essayé ces deux bindings, PyGtk et PyQt4 ? Quelle en est votre expérience ? Comment s'est fait votre choix ? Avez-vous préféré un autre binding ?
Ou bien êtes-vous à l'opposé : Python, c'est bien mais pas pour des GUI. Quels sont vos griefs ? Que manque-t-il à Python ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de Matthieu Brucher Matthieu Brucher - Rédacteur https://www.developpez.com
le 19/08/2010 à 17:36
PyGTK s'est sans doute amélioré, il fut une époque où il ne valait mieux pas trop l'utiliser en multithread. Plutôt que PyGTK, je prendrai wxPython.
Avatar de wiztricks wiztricks - Modérateur https://www.developpez.com
le 19/08/2010 à 21:44
Salut,

Je connais peu de GUI écrits en Python.

Par contre, il existe des "bindings" qui permettent d'écrire des IHM avec Python qui utiliseront les GUI: Wx, GTK, Qt,...

A la base ces bindings n'apportent aucune fonctionnalité supplémentaire: elles permettent d'utiliser les existantes...

Préférer Qt à Wx ou le contraire, pourquoi pas, mais pourquoi mettre Python dans la balance pour un tel choix?

Par contre, nous pourrions avoir une discussion plus pythonique sur un thème proche... est ce que
satisfont ceux qui s'intéressent à Python pour faire du RAD.

- W
Avatar de kango kango - Membre éprouvé https://www.developpez.com
le 20/08/2010 à 22:08
bonsoir,

je ne connais pas PyGTK, j'utilise PyQt/QtDesigner pour des interfaces simples. Je suis satisfait du résultat.

comment s'est fait mon choix ? après avoir fait du Tkinter qui est limité, il était question de changer. Le facteur déclencheur est lié au fait que Tkinter n'est pas thread-safe. Le choix s'est porté entre wxPython et PyQt. C'est surtout QtDesigner qui a fait la différence. Je n'ai pas du tout accroché à boa.

la rapidité d'apprentissage de la librairie, facilitée par QtDesigner et QtAssistant et le livre de Mark Summerfield (Rapid GUI Programming with Python and Qt) m'a convaincu de ce choix.

j'avais aussi parcouru wxPython in action et fais quelques tests avec WxPython, ça m'a beaucoup plus.

ensuite, je pense que le lien pointant les lacunes de Python en terme d'IHM est dépassé et un brin malhonnête. comment peut on tirer une telle conclusion avec seulement les tests qui ont été faits ?
Avatar de boulabiar boulabiar - Futur Membre du Club https://www.developpez.com
le 24/08/2010 à 12:22
Je vous conseille PySide
http://www.pyside.org/

PySide est License LGPL et avec l'API compatible PyQt (License GPL)
Avatar de afranck64 afranck64 - Membre éprouvé https://www.developpez.com
le 24/08/2010 à 19:29
Bonsoir,

moi pour le moment je fait mes GUI avec Tkinter. Depuis le début ça allait mais je pense que je vais bientôt me mettre à wxPython. J'ai vu des interfaces avec et j'apprécie beaucoup.

@+ et bon code
Avatar de o.girardot o.girardot - Membre confirmé https://www.developpez.com
le 24/08/2010 à 21:56
Bonsoir,
Après plusieurs expériences en Python, j'ai trouvé la plupart des framework assez compliqués, peu maintenable et surtout peu sympathique esthétiquement.
Je suis revenu de cette opinion en découvrant le binding Python PyQt pour le framework Qt de nokia.
J'ai réussi à faire d'agréables interface graphique avec la facilité et la rapidité qui caractérise python ! j'ai d'ailleurs publié récemment un article d'introduction à PyQt sur developpez.net :
http://ogirardot.developpez.com/introduction-pyqt/

Un point qui m'a un peu refroidi, était le coté GPLv3 + license commerciale de PyQt, mais comme l'a signalé boulabiar le framework PySide est compatible en terme d'api avec PyQt et est totalement libre !
Donc tout mon code a à peine évolué dans le passage de l'un à l'autre.
et en plus le livre Rapid Programming with PyQt est un très bon ouvrage.

Donc pour le point final, je recommande tout autant PySide et je suis de près son développement.
D'ailleurs tous mes futurs articles seront avec PySide dans le rôle principal, surtout pour son coté LGPL.

Bonne soirée,

Olivier.
Avatar de monnomamoi monnomamoi - Membre averti https://www.developpez.com
le 25/08/2010 à 7:54
Hello,

Personnellement je programme avec PyGTK, que je trouve à la fois simple et assez puissant. J'ai aussi utilisé Tkinter, qui est très pratique pour faire des boites de dialogues mais on est vite limité...

Les IHM en python ne sont pas particulièrement lentes à condition de ne pas faire de bidouilles qui nécessitent un rafraichissement fréquent, comme par exemple implémenter les numéros de lignes dans une zone de texte (ça m'étonne d'ailleurs que ce ne soit pas disponible dans Scintilla). Mieux vaut utiliser les possibilités existantes d'un widget, ou même laisser tomber si la fonctionnalité n'est pas présente par défaut.

En bref, PyGTK est très bien pour développer rapidement une interface à un soft, mais il vaut mieux ne pas en vouloir plus que ce que GTK peut offrir.

Glade 3, c'est bien, mais placer par défaut un GtkWindow en mode invisible me paraît vraiment complètement débile ;
Au contraire, si la fenêtre est visible par défaut elle va se rafraichir à chaque fois qu'on ajoute un widget, donc ça va prendre 3 plombes à démarrer. Mieux vaut construire l'IHM "hors écran" puis l'afficher à la fin.

Certains widgets ne sont pas dans Glade 3 (GtkSourceView, GtkHTML, etc.) ;
GtkSourceView supporte Glade3, comme de nombreux autres widgets qui ne sont pas distribués avec PyGTK, à condition de le compiler avec l'option adéquate.

Fautes de frappe dans Devhelp qui font perdre du temps. Exemple : set_tabs_width au lieu de set_tab_width.
J'ai aussi remarqué quelques erreurs dans la doc PyGTK, heureusement rares, mais c'est vrai que c'est gênant.

-
Avatar de fraoustin fraoustin - Membre éprouvé https://www.developpez.com
le 25/08/2010 à 8:57
pour ma part je réalise tout en tkinter et surtout depuis les versions 2.7 et supérieur en ttk (je vous conseil vraiment de jeter un coup d'oeil)
pas de module supplémentaire à installé, que du bonheur

souvent je me suis vu faire des IHM en html et javascript et mettre python côté serveur
Avatar de - https://www.developpez.com
le 25/08/2010 à 10:58
> wiztricks
Merci pour les liens, je ne connaissais ni Camelot ni Traits
vu que je fais moi-meme pas mal de developpement PyQt avec Elixir (et une pincee de mechanize et lxml...) je vais surement jeter un oeil a Camelot sous peu.

Par contre, malgre quelques petites recherches, j'avoue que j'ai du mal a voir la valeur ajoutee par Traits.

  • Initialization: A trait has a default value, which is automatically set as the initial value of an attribute before its first use in a program.
  • Validation: A trait attribute's type is explicitly declared . The type is evident in the code, and only values that meet a programmer-specified set of criteria (i.e., the trait definition) can be assigned to that attribute. Note that the default value need not meet the criteria defined for assignment of values.
  • Delegation: The value of a trait attribute can be contained either in the defining object or in another object delegated to by the trait.
  • Notification: Setting the value of a trait attribute can notify other parts of the program that the value has changed.
  • Visualization: User interfaces that allow a user to interactively modify the value of a trait attribute can be automatically constructed using the trait's definition.

Initialisation, ben on connait deja non, les arguments par defaut ?
Validation, vu que le typage est verifie au runtime, qu'est ce que ca change ?
Delegation, en tant qu'utilisateur PyQt je m'en sers deja pas mal
Notification => signal/slot ?

Je dis tout ca sans arriere pensee, je ne demande qu'a etre convaincu !!!
Avatar de parisien1082 parisien1082 - Candidat au Club https://www.developpez.com
le 25/08/2010 à 11:07
Pour ma part on m'a imposé l'utilisation de wxPython
Je peux dire qu'on peut faire pas mal de chose et assez rapidement.
J'utilise wxGlade ,pour générer les interfaces , et Eclipse pour le code Python .

J'ai fait une application avec plusieurs connexions TCP/IP en parallèle , qui fait pas mal de calcul et rafraichit l'IHM en temps réel , ça marche mais ça consomme beaucoup trop de CPU et de mémoire . Donc si c'était à refaire j'opterais pour C++/QT.

A mon avis les inconvénients majeurs de Python/WxPython:

-Les mises à jour de wxPython ne sont pas très fréquentes (1 fois par an en moyenne ).
-Impossibilité d'utiliser les multi-core du PC à cause du "Global Interpreter Lock" .
-Manque de documentation .
Responsable bénévole de la rubrique Qt : Thibaut Cuvelier -