Journal GUY : un module python3 pour créer des GUI multiplateforme (android aussi!)

Posté par  (site Web personnel) . Licence CC By‑SA.
Étiquettes :
22
24
nov.
2019

Guy c'est la nouvelle version de wuy.

C'est une librairie python3 (async), qui permet de fabriquer un GUI (à base de HTML/JS/CSS), qui fonctionnera sur toutes les plateformes, et android compris.

Un 'hello world' pourrait ressembler à ça :

    from guy import Guy

    class Simple(Guy):
        """<button onclick="self.test()">test</button>"""

        def test(self):
            print("hello world")

    if __name__ == "__main__":
        app=Simple()
        app.run()

L'idée de base, est de pouvoir créer rapidement un GUI pour son script, et de pouvoir le releaser sur toutes les plateformes. Du coup, une fois freezé (pyinstaller), on peut avoir un programme/gui qui fait dans les 7mo, et qui n'a besoin d'aucune dépendance, à part chrome.

Accessoirement, si on ne veut pas forcer l'utilisateur à avoir chrome. On peut utiliser cefpython3, pour gérer la partie cliente. Mais là, on se rapproche d'electron, et l'exe freezé fera dans les 60mo.

Toujours accessoirement, l'application guy peut également être lancer en mode server web, et utiliser n'importe quel navigateur comme client.

La principale nouveauté; c'est la possibilité de créer un APK (~13mo). Une même appli fonctionnera, sans aucune modif, sur n'importe quelle plateforme.

A ce propos, il y a un tuto pour builder son premier guy's APK :
https://guy-docs.glitch.me/howto_build_apk_android/

Si il y avait des bonnes âmes qui aimerait bien tenter de le suivre, histoire de savoir si ça marche pour d'autres personnes que moi ;-)

Alors, certes, ça peut paraître un peu "jouet" comme ça. Mais il est tout à fait possible de fabriquer des très grosses applis. Mais dans ce cas là, mieux vaut prévoir un bon framework côté JS pour assurer l'interface.

Guy est né, suite à la lecture de cet excellent journal (minipy) de @omc. C'était la feature que j'avais besoin de rajouter à wuy ;-)

  • # infos

    Posté par  . Évalué à 2. Dernière modification le 24/11/19 à 15:06.

    BTW, Some python modules can't be embedded in an APK : use pure python modules !

    Pour quelqu'un qui débute/bidouille en Python, quelles sont les limitations ?

    android.permissions = INTERNET

    Peut-on en mettre plusieurs (par exemple la géolocalisation) ?

    • [^] # Re: infos

      Posté par  (site Web personnel) . Évalué à 3. Dernière modification le 24/11/19 à 15:33.

      Pour quelqu'un qui débute/bidouille en Python, quelles sont les limitations ?

      Alors, c'est des contraintes plus liées à kivy/buildozer(p4a) qu'à guy. Je n'ai pas trouvé de liste exhaustive de ce qui marche ou ne marche pas. Mais globalement, il y a plus en plus de choses qui marchent ;-)

      Tout ce qui est pure python ne devrait pas poser de problèmes. Tout ce qui utilise des binaires peut être problématique.

      Peut-on en mettre plusieurs (par exemple la géolocalisation) ?

      Tout à fait ! séparé par des virgules.
      J'ai màj la doc pour pointer vers la liste exhaustive d'android

      • [^] # Re: infos

        Posté par  . Évalué à 1.

        Merci. Ça donne envie d'essayer.

  • # Re:

    Posté par  . Évalué à 1.

    est une librairie python3 (async), qui permet de fabriquer un GUI (à base de HTML/JS/CSS)

    Su Android, on peut déjà créer une webview avec un bridge en JS entre l'application web <-> et le code natif JAVA, du coup quel est le plus de ce projet, par rapport à cette méthode ?

    • [^] # Re:

      Posté par  (site Web personnel) . Évalué à 7.

      guy n'est pas exclusivement réservé au dev d'app android !

      Une même application, marchera tout aussi bien sur windows, linux, mac ou autres. C'est juste une feature supplémentaire que de pouvoir, aussi, en faire un apk/android.

      Accessoirement, côté backend, c'est du python (et pas du java)

      • [^] # Re:

        Posté par  . Évalué à -6.

        Salut,

        Accessoirement, côté backend, c'est du python (et pas du java)

        Peux-tu développer ?

        Je fais du java et du python en backend et (grosse surprise) je fais plus de bugs en python qu'en java.

        • [^] # Re:

          Posté par  . Évalué à 4.

          Il a dit que c'est une différence. Son truc permet aux développeurs python de faire ce que les développeurs java peuvent faire nativement (du fais de l'API java d'android)

          • [^] # Re:

            Posté par  . Évalué à -10. Dernière modification le 24/11/19 à 19:26.

            Salut,

            Il a dit que c'est une différence.

            Et moi je dis que python ou java, ce n'est pas le soucis.

            Son truc permet aux développeurs python de faire ce que les développeurs java peuvent faire nativement (du fais de l'API java d'android)

            Donc les devs python seraient inférieurs aux devs java ?

            • [^] # Re:

              Posté par  . Évalué à 5.

              Hein ?! Pourquoi tu met des questions de valeur dans tes commentaires ? Il faut nécessairement un plus fort ?

              Ça permet aux gens qui veulent faire du python d'en faire.

              • [^] # Re:

                Posté par  . Évalué à -9.

                Salut,

                Hein ?! Pourquoi tu met des questions de valeur dans tes commentaires ? Il faut nécessairement un plus fort ?

                Je crois que tout le monde a compris : il n'y a aucun commentaire de valeur.

                • [^] # Re:

                  Posté par  . Évalué à 6.

                  Je crois que tout le monde a compris : il n'y a aucun commentaire de valeur.

                  Ah mais pas du tout efface, mo je ne comprends rien au sens de ton commentaire. C'est pas bien python ?

                  La gent féminine, pas la "gente", pas de "e" ! La gent féminine ! Et ça se prononce comme "gens". Pas "jante".

        • [^] # Re:

          Posté par  (site Web personnel) . Évalué à 4.

          Marrant … Je fais aussi du python et du java (jboss/springboot) ;-)
          Mais de là à dire que je fais plus de bug en python qu'en java … non ;-)
          Suffit d'être organiser et d'écrire des tests qui couvrent.

          De grands pouvoirs impliquent de grandes responsabilités.

          Peux-tu développer ?

          Une application guy : c'est en fait une partie serveur (backend), en python … et une partie cliente (frontend), en html/js. Ces 2 là, communiquent ensemble via une websocket. La partie cliente est automatiquement lancé dans un chrome "headless". Le tout, donne l'impression d'une vraie appli. Avec un peu de css/js, tu arrives simplement à donner un look'n'feel d'appli native, et bluffer ton client.

          Bref, c'est du "python pure" (Il faut, evidemment, qques connaissances html/js/css pour faire un GUI décent)

          Ce n'est lié aucunement à java.

          • [^] # Re:

            Posté par  . Évalué à -4. Dernière modification le 24/11/19 à 19:15.

            Salut,

            Ce n'est lié aucunement à java.

            Ah bon, ça me rassure.

            Bref, c'est du "python pure" (Il faut, evidemment, qques connaissances html/js/css pour faire un GUI décent)

            Ah bin là, on n'est plus dans le pur :)

    • [^] # Re:

      Posté par  . Évalué à 2.

      Personnellement je fait beaucoup de python et de techno web (comprendre frontend) et j'ai pas trop envie d'investir du temps à apprendre du java quand j'ai des besoin mobile. Jusqu'ici j'ai toujours eu des moyens d'esquiver (ionic par exemple) mais souvent full js, la j'ai du python je suis content.

      Après, la dépendance à kivy/buildozer me fait un peu peur, (j'ai pas eu de bonne expériences avec ,beaucoup de temps perdu pour des broutilles, mais qui sait, ça c'est peut être amélioré et moi aussi depuis le temps.)

      NB: je considère pas Java comme de la merde mais comme un écosystème complexe avec une courbe d’apprentissage trop pentu pour moi et un investissement en temps trop important pour mes besoins

      • [^] # Re:

        Posté par  (site Web personnel) . Évalué à 1.

        Si t'arrives a installer les couches Kivy/bulldozer …

        Le tuto joint ne devrait poser aucun problème … Jusqu'au déploiement sur le play store…

        Chez moi ça marche !

        Maintenant Guy est exactement fait pour les gars comme nous. Python, pk c'est bon … Et HTML/je/CSS pour le front.

        A partir de la tout est possible … Tu peux profiter des 2 eco système et utiliser leurs meilleures pubs.

  • # Petites remarques

    Posté par  . Évalué à 5.

    Ton projet est plutôt sympa. J'ai de petites remarques :

    • l'utilisation de docstring pour le code html est peut être sympa pour les exemples, mais je pense qu'il peut devenir gênant sur des projets de plus grandes envergure car les classes ne sont plus documentables
    • mon rapide parcours de la documentation ne fa pas permis de trouver un moyen simple de faire le lien entre un fichier de template html et sa classe associée. Il faut forcément faire sois même la lecture du fichier ?
    • le routeur http me semble vraiment simpliste, on ne peut pas faire de routage sur les verbes ou les entêtes http ?
    • la documentation passe beaucoup de temps à toute que tel ou tel chose est un non-sens. Je pense que ça peut rendre la compréhension difficile pour un débutant
    • il est question de mode serveur la sécurité est gérée d'une manière ou d'une autre ?
    • [^] # Re: Petites remarques

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

      merci pour le retour

      l'utilisation de docstring pour le code html est peut être sympa pour les exemples, mais je pense qu'il peut devenir gênant sur des projets de plus grandes envergure car les classes ne sont plus documentables

      Tout à fait … ça a juste un côté très pratique pour "vite faire".
      Pour les plus gros projets : mieux vaut séparer le contenu du contenant

      mon rapide parcours de la documentation ne fa pas permis de trouver un moyen simple de faire le lien entre un fichier de template html et sa classe associée. Il faut forcément faire sois même la lecture du fichier ?

      Non, il suffit de créer un fichier du nom de la classe dans le répertoire "static".

      si tu as une classe

      class MyApp(Guy):
         ...

      --> il faudra un fichier "static/MyApp.html"

      C'est dans la doc, partie "rendering" … mais ça mérite eclaircissement

      le routeur http me semble vraiment simpliste, on ne peut pas faire de routage sur les verbes ou les entêtes http ?

      Ce dernier ne sert juste qu'à offrir une possibilité, coté back, de retourner du contenu par http. (une sorte de hook dans le serveur http de guy).
      C'est vraiment pour faire du spécifique.

      Mais une application guy communique par websocket principalement.

      Dans ce hook http, tu peux tester le verbe http, et réagir ou non.

      la documentation passe beaucoup de temps à toute que tel ou tel chose est un non-sens. Je pense que ça peut rendre la compréhension difficile pour un débutant

      Fort probable!

      il est question de mode serveur la sécurité est gérée d'une manière ou d'une autre ?

      Il y a le minimum ;-)

      Disons, qu'en "mode app" (app/cef), le serveur http/ws n'écoute que sur le localhost (pas en wide/0.0.0.0). Comme c'est dédié à la partie cliente-forcément en localhost) : c'est suffisant. Du coup, impossible de venir interférer sur le serveur à partir d'une autre machine que localhost.

      En mode serveur : il écoute en wide/0.0.0.0, car c'est plus pratique pour venir s'y connecter d'autres machines ;-). Après, si c'est destiné à être hébergé sur un vrai serveur. Tu peux mettre du nginx en front, avec certificats/ssl et co.

    • [^] # Re: Petites remarques

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

      Il faut forcément faire sois même la lecture du fichier ?

      non, ça c'est une feature pour des cas assez particulier où tu aurais besoin de produire du html dynamiquement.

      J'ai une démo, où j'utilise ça pour générer automatiquement des composants/sfc vuejs, à l'aide de vbuild

      a guy's app serving a vuejs/sfc UI (Play with sources)

  • # Un autre guy

    Posté par  . Évalué à 3.

    … en a parlé sur reddit ;-)

    Longue vie !

Suivre le flux des commentaires

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