PySimpleGUI : prenez plaisir à faire des interfaces graphiques en Python

Posté par  . Édité par Benoît Sibaud. Modéré par palm123. Licence CC By‑SA.
57
30
jan.
2021
Python

Je cherchais depuis longtemps un moyen simple de créer des interfaces graphiques pas trop compliquées pour mes scripts Python. Les approches objet et/ou à base de langages dédiés (sur base XML par exemple) m'avaient plutôt rebutées jusqu'à présent, et malheureusement celles-ci sont ultra majoritaires. J'avais eu du mal à rentrer dans tkinter ou pyQT par exemple, et à les utiliser de manière efficace.

C'est alors que j'ai découvert, récemment, PySimpleGUI, et que j'ai enfin réussi à être productif en matière d'interface graphique en Python !

PySimpleGUI est sous licence LGPLv3.

Les concepts de base de PySimpleGUI sont les suivants :

  • on déclare les différentes parties de son interface graphique sous forme de listes imbriquées d'éléments graphiques. La liste extérieure représente les lignes d'éléments graphiques à afficher à l'écran de haut en bas. Au sein de chaque ligne, les éléments sont également rangés de gauche à droite au sein d'une liste. Ainsi, pour un écran avec une ligne de texte, puis une autre ligne juste en dessous avec une invite et un bouton, on peut déclarer la disposition comme suit :
    ma_disposition = [[sg.T("Mon texte")], [sg.In("ce texte est modifiable"), sg.B("Cliquez sur ce bouton")]].

  • on attribue à chaque élément avec lequel on souhaite interagir un identifiant sous forme de chaîne de caractère (par exemple "-MON-ELEMENT-"). Cet identifiant deviendra une clé utilisée dans les situations présentées ci-dessous. Dans notre exemple simple, l'ajout de cette clé se fait comme suit : ma_disposition = [[sg.T("Mon texte")], [sg.In("ce texte est modifiable", key="-MON-INVITE-"), sg.B("Cliquez sur ce bouton", key="-MON-BOUTON-")]]

    • lorsque l'élément en question déclenche un événement, l'événement porte le même identifiant que l'élément qui l'a émis (ex : "-MON-ELEMENT-").
    • Les valeurs associées à l'événement (nouvelle position pour un curseur par exemple, ou lignes sélectionnées dans une table), ainsi que celles associés à tous les autres éléments actifs à cet instant à l'écran sont transmises en même temps que chaque événement dans un dictionnaire nommé "values" : values["-MON-INVITE-"] contiendra par exemple le texte saisi par l'utilisateur dans le champ texte présenté plus haut.
    • la mise à jour des données associées à un élément se fait via la syntaxe suivante : window["-MON-ELEMENT-"].update("ma nouvelle valeur")

Et c'est à peu près tout ce qu'il faut savoir pour créer des interfaces graphiques grâce à PySimpeGUI ! Des options supplémentaires sont disponibles pour modifier le positionnement par défaut des différents éléments, leur comportement, leur apparence… Cette approche très simple des interfaces graphiques m'ont personnellement permis de mettre très vite sur pied (quelques heures) une fenêtre avec plusieurs onglets permettant d'interagir plus facilement avec une base SQLite : chargements de fichiers excel, affichage de tables…

N'hésitez pas à consulter les exemples présents dans le cookbook par exemple.

Bonne conception graphique !

Aller plus loin

  • # Quelques compléments

    Posté par  . Évalué à 10.

    PySimpleGUI a été créée en 2018. C'est donc un projet encore jeune, mais il est parfaitement utilisable et d'après son auteur est déjà utilisé en production chez IBM ou amazon par exemple (peut-être par 3 personnes dans chaque cas, peut-être plus !).

    La version de base utilise tkinter comme cadriciel graphique sous-jacent. C'est la version de référence la plus complète.

    Le même code PySimpleGUI peut aussi fonctionner en utilisant QT, WxWidgets ou des technos web en coulisse (via le projet Remi dans ce dernier cas), en remplacement de tkinter, via une simple modification de la ligne d'import de la bibliothèque. Quelques fonctionnalités peuvent alors manquer parfois, mais quelques autres peuvent aussi devenir possibles, en fonction de la maturité de chacun de ces "portages".

    PySimpleGUI est donc entièrement multi-plateformes.

    Le modèle de développement est par ailleurs un peu particulier : l'auteur n'accepte que les remontées d'anomalies ou les propositions d'amélioration dans github, mais pas directement les pull requests.

    • [^] # Re: Quelques compléments

      Posté par  (site web personnel) . Évalué à 10. Dernière modification le 01 février 2021 à 19:18.

      En tant que fan de Qt et utilisateur occasionnel de tkinter et utilisateur extrêmement réservé de Gtk, j'étais assez curieux d'aller voir.

      En gros, ça permet de construire en peu de lignes de codes des dialogues. Je peux concevoir que se fader la doc Qt ou tkinter juste pour un dialogue de 5 boutons, ce soit très rébarbatif, donc oui, ce projet a un sens.

      Pour un dialogue simple, vous aurez surement un résultat en quelques minutes et pour un complexe, en quelques dizaines de minutes. Il faut quand même comprendre la logique de fonctionnement des évènements mais c'est très raisonnable.

      Par contre, pour construire une application à proprement dit, je pense qu'il vaut mieux tout de suite passer à la vitesse supérieure avec un toolkit graphique plus élaboré. Le propre des applications graphiques, c'est que si elles répondent bien à un besoin, on leur demande tout plein d'évolutions et on est alors très content d'avoir choisi un toolkit flexible. J'ai encore eu le cas au boulot d'un collègue qui voulait une application très simple pour une démo. Comme la démo a bien marché, il a du faire à vitesse grand V la v2 et autant PySimpleGui aurait pu suffire pour la première, autant pour la version 2, c'était mieux d'avoir un truc un peu plus élaboré.

      Je me méfie un petit peu de l'aspect multi-backend. L'expérience de WxWidget, c'est que très vite, on tombe sur des bugs spécifiques à un backend qu'on doit contourner dans le code principal. A voir si ce genre de problème impactera PySimpleGui mais je pense que l'ambition plus modeste que WxWidget pourra lui éviter plus facilement ce genre d'écueil.

      En tout cas, le site est soigné, les exemples sont nombreux et clairs, on sent qu'il y a un soin pris pour que ce projet soit une réussite. Bravo à l'auteur!

    • [^] # Re: Quelques compléments

      Posté par  . Évalué à 7.

      Je m'amuse parfois à faire des petits scripts Python sous Windows et je trouve qu'une interface graphique est souvent trop lourde à mettre en place. Je reste sur une interface "console" même lorsqu'il y a de l'interaction avec un utilisateur.

      Pour fournir le script, j'utilise Autopytoexe qui me génère un "single file executable". Avec PySimpleGUI, l'exécutable de base a une taille de 10 Mo ce que je trouve relativement raisonnable pour ce genre d'application. Ce n'est clairement pas léger mais si la légèreté est le but recherché, le problème n'est pas à chercher du côté de PySimpleGUI.

      Merci pour la découverte !

  • # licence LGLP3

    Posté par  . Évalué à 8.

    L'auteur de PySimpleGUI fait remarquer que le code est sous licence LGPL3, et non MIT comme noté dans la dépêche.

    https://twitter.com/PySimpleGUI/status/1355619302062362627
    https://github.com/PySimpleGUI/PySimpleGUI/blob/master/license.txt

    • [^] # Re: licence LGLP3

      Posté par  (site web personnel) . Évalué à 5.

      Corrigé, merci.

      • [^] # Re: licence LGLP3

        Posté par  (site web personnel) . Évalué à 3. Dernière modification le 01 février 2021 à 14:59.

        Si c'est sous LGPL3, je doute que ce soit utilisé chez Amazon. Y'a des licences qui rendent les logiciels interdits aux employés. La LGPL3 en ferait partie que ça ne m'étonnerait pas.

        • [^] # Re: licence LGLP3

          Posté par  . Évalué à 2.

          Pourquoi ?

          • [^] # Re: licence LGLP3

            Posté par  (site web personnel) . Évalué à 3.

            Parce que plein de boîtes refusent d'utiliser des licences virales. Ils n'ont aucune envie de devoir fournir le code source de leurs produits propriétaires parce qu'un ingénieur a utilisé une bibliothèque ou un outil qui contamine le produit final.

            • [^] # Re: licence LGLP3

              Posté par  . Évalué à 6.

              Ben justement, on parle de la LGPL, pas de la GPL.

              • [^] # Re: licence LGLP3

                Posté par  . Évalué à 6.

                Exactement. La LGPL va forcer l'utilisateur de la lib a distribuer a ses clients les modifications faites a PySimpleGUI, mais pas a liberer le code des programmes utilisant PySimpleGUI.
                A ce titre, elle est beaucoup mieux acceptee dans les grandes entreprises que la GPL.

                Excusez l'absence d'accents dans mes commentaires, j'habite en Australie et n'ai pas de clavier francais sous la main.

            • [^] # Re: licence LGLP3

              Posté par  (site web personnel) . Évalué à 9.

              Tu veux dire licence héréditaire (pour rester dans le domaine biologique), transmettrice, insufflatrice, ensemenceuse…, bref une licence qui accroît les libertés fidèles au concept de réciprocité en la conservant dans les œuvres dérivées de celles qu’elle protège, c'est bien cela ? :)

  • # Python et QML n'est pas plus compliqué ...

    Posté par  . Évalué à 3.

    mais c'est possible qu'il manque des bons tutoriels et parfois une petite surcouche pour simplifier les choses.

  • # Alors, je suis désolé mais...

    Posté par  (site web personnel) . Évalué à 0.

    En gros c'est un "yad" mais en Python. Bon admettons. Mais coté productivité je ne vois pas le gain par rapport à l'utilisation de Glade.

    Dans Glade, tu poses tes éléments "à la souris" (même si je suis pas fan de la souris, on parle ici de créer une interface), et tu "charges" simplement la vue (et les signaux) en deux lignes de code.

    Ça permet de séparer le contrôle de la vue. Si jamais la vue ne me va pas, je ne touche pas le code…

    builder = Gtk.Builder()
    builder.add_from_file('interface.glade')

    Et tu peux chopper tous les objets par leurs IDs depuis "builder"…

    Donc, bref, PySimpleGUI c'est bien, mais le gain est "minime" selon moi…

    • [^] # Re: Alors, je suis désolé mais...

      Posté par  . Évalué à 4.

      juste pour mon info :

      Gtk.builder(), c'est dispo facilement (pip install) sur MacOS/Windows ?

      Envoyé depuis mon Archlinux

    • [^] # Re: Alors, je suis désolé mais...

      Posté par  . Évalué à 7.

      Ça permet de séparer le contrôle de la vue. Si jamais la vue ne me va pas, je ne touche pas le code…

      Jamais été convaincu par cet argument. On arrive très vite à devoir toucher au code si on change de widget. Et puis ton XML c'est tout autant du code que le python.

      • [^] # Re: Alors, je suis désolé mais...

        Posté par  (site web personnel) . Évalué à 3.

        non, clairement pas. On sépare la "présentation" de l'interface (comme du HTML) de son implémentation. Je trouve cela plus clair, plus clean.

        Encore qu'à la lecture de ta dépêche j'ai trouvé que pySimpleGUI a bien pensé à structurer la présentation de ton interface, plutôt que de permettre de mélanger sa présentation et l'interation avec le contrôleur….

  • # GUI Builder python

    Posté par  . Évalué à 3.

    Un outil simple pour une single page app en mode WYSIWYG: Page GUI Builder by Dan Rozenberg

    http://page.sourceforge.net/
    Il produit une page .py et une page _support.py avec les fonctions définies dans les bindings.
    Si on modifie l'interface, il propose d'updater le fichier support sur lequel on a déjà travaillé.
    Et il fait tourner du tKinter out of the box.
    Enjoy :)

  • # Oxymore…

    Posté par  . Évalué à -1.

    Les mots « plaisir » et « python » dans la même phrase ont piqué ma curiosité…

  • # Commentaire supprimé

    Posté par  . Évalué à -1. Dernière modification le 16 février 2021 à 10:59.

    Ce commentaire a été supprimé par l’équipe de modération.

    • [^] # Commentaire supprimé

      Posté par  . Évalué à -1. Dernière modification le 16 février 2021 à 10:59.

      Ce commentaire a été supprimé par l’équipe de modération.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.