GUI

  • Pysimplegui

    PySimpleGUI

    Par Le 12/09/2020

     Bonjour,

    La semaine dernière, alors que j'étais plongé dans le code de mon environnement de bureau fait maison, je me suis demandé s'il existait des alternatives à l'interface graphique Tkinter. Une rapide recherche sur Internet m'a confirmé qu'il en existait plusieurs, plus ou moins difficiles et plus ou moins bien documentées. L'une d'entre elles a tout particulièrement retenu mon attention. Il s'agit de PySimpleGUI.

    PySimpleGUI est en grande partie basée sur Tkinter et promet à l'utilisateur, une expérience de programmation graphique d'une simplicité indécente. La structure du code est censée être beaucoup plus intuitive. Séduit par ce discours de bonimenteur, j'ai décidé de voir ce que cet outil avait dans le ventre. J'ai donc remplacé tkinter par PySimpleGUI dans le programme instanciant mon environnement de bureau personnel. Passé l'enthousiasme des premières heures, j'ai vite compris que la simplicité allait s'avérer plus compliquée que prévue. L'expérience n'a pas répondu à mes attentes, ce qui ne signifie pas que l'outil n'a aucun intérêt. C'est juste qu'il ne fonctionne pas.

    Mais tout d'abord, laissez-moi vous présenter les bases de ce GUI qui diffèrent de celles de tkinter: 

    Avec tkinter, on instancie d'abord la fenêtre mère puis on vient y placer des widgets enfants. C'est-à-dire que la poule précède les oeufs. Cela nous donne:

    Code

    Tkinter
     

    Avec PySimpleGUI, c'est le contraire, on instancie d'abord les oeufs dans un layout ( = agencement) avant de les donner à la poule qui est instanciée en dernier. En clair, l'instanciation des widgets enfants précède celle du widget parent.

    Code2

    Pysimple


    Veuillez noter que la place des accolades dans le layout a toute son importance. Dans le code ci-dessus, les boutons sont agencés sur deux rangées différentes. Si j'eus souhaité que les boutons eussent été sur la même rangée, j'eus écrit ceci :

    Code3 1

     

    Voici la traduction de ce qu'écrit un membre de l'équipe PySimpleGUI. Le texte original est ici:

    Cette fenêtre peut vous sembler "laide", car aucun effort n'a été fait pour la rendre agréable à regarder. Elle est purement fonctionnelle. Il y a 30 éléments dans la fenêtre. Trente éléments. Compte tenu de ce qu'elle fait, c'est miraculeux ou tout au moins incroyablement impressionnant. Pourquoi ? Parce qu'en moins de 50 lignes de code, cette fenêtre a été créée, affichée, a recueilli les résultats et les a affichés dans une autre fenêtre.

    50 lignes. Il vous faudra 50 lignes de code tkinter ou Qt pour obtenir les 3 premiers éléments de la fenêtre écrite, si vous voulez faire cela.

    Non, soyons clairs ici... cette fenêtre nécéssitera une quantité massive de code en utilisant les GUI conventionnels. C'est un fait et si vous voulez me prouver que j'ai tort, alors faites-le, s'il vous plaît. Veuillez écrire cette fenêtre en utilisant tkinter, Qt, ou WxPython et envoyez le code! Notez que cette fenêtre a même une barre de menu en haut, ce qu'on peut facilement ne pas remarquer.

     

    Voici la ci-devant fenêtre:

    Ex2

     

    Et voici l'image d'un beau melon:

    Melon

     

    Hein? Non, c'est juste pour faire la transition et enchaîner sur la différence de traitement des images entre les deux GUI. Avec tkinter, il faut utiliser PIL ou Pillow et traiter les images pour que celles-ci puissent être affichées par le GUI.
    Avec PySimpleGUI, c'est le Saint-Esprit qui s'en occupe. Vous, vous avez juste à renseigner le chemin de l'image, pourvu qu'elle soit en *.png (comme tkinter), et vous aurez la satisfaction de voir ce beau melon s'afficher sur un bouton par exemple.

    Donc, je résume :

    • Une syntaxe plus facile et plus intuitive,
    • Pas de gestionnaire de placement proprement dit (grid() ou pack()). Il suffit de placer les widgets dans des listes,
    • Traitement des images par l'intercession du Saint-Esprit,
    • Une gestion exclusivement commandée par les événements.

    Si vous prenez le temps de flâner sur le site de PySimpleGUI, dont les pages curieusement, sont un peu longues à charger, vous découvrirez qu'il est possible de créer des fenêtres sympas, qui, comme il est écrit dans un paragraphe, ne sont pas enlaidies par un design vieillot sorti tout droit des années 90...

     

    Ex

     

    En ce qui me concerne, après avoir "basculé" mon code sur pysimpleGUI:

    • l'affichage multiécrans s'est transformé en affichage au petit bonheur la chance.
    • Certains boutons du menu principal n'affichent pas les sous-menus.
    • La barre des tâches s'affiche sur un écran mais pas sur l'autre, tandis que le menu s'affiche sur l'écran qui n'a pas la barre des tâches, mais ça dépend. Parfois, c'est le contraire.
    • Les applications s'ouvrent... ou pas. Là encore, ça dépend.
    • Le traitement des images est une catastrophe. Mais ça dépend.

    En fait, avec PySimpleGUI, j'ai eu l'impression d'être le témoin privilégié d'une expérience de physique quantique, qui autorise un objet à se trouver de manière aléatoire, dans deux états différents au même instant.

    Au bout d'une semaine, j'ai capitulé, je me suis remis à boire et je suis revenu sur la version tkinter de mon environnement de bureau. Même si ce dernier est toujours en chantier, même s'il présente encore de nombreuses imperfections, je l'utilise au quotidien et il est opérationnel (sur deux écrans). PySimpleGUI est, de mon point de vue, une intercouche qui complique inutilement l'utilisation de tkinter, ou qui, pour le dire plus clairement, ne simplifie pas de manière substantielle, la complexité toute relative de tkinter. En tout cas, ce qui est sûr, c'est que la simplicité de PySimpleGUI est bien trop compliquée.

     

expand_less