Journal Python et PyQt

Posté par  .
Étiquettes : aucune
0
29
sept.
2005
Avec la venue de Qt4 il est maintenant possible de créer des applications GPL pour Microsoft Windows.

La version 4 du cadriciel (framework) Qt apport son lot de nouveautés et notamment de quoi faire du dessin vectoriel.

J'ai depuis peu de temps je me suis mis mis à Python, un fort jolie langage. Afin de tester les modules Python PyQt qui permettent d'utiliser les classes Qt dans Python j'ai réalisé une petit application.

J'ai tellement apprécié d'utiliser conjointement Python, PyQt et Qt Designer que j'en ai écris un tutoriel et j'aimerais vous le faire partager

http://dosimple.ch/articles/Python-PyQt/(...)

Vous critiques sont les bienvenues
Ciao
  • # C'est sur...

    Posté par  . Évalué à 0.

    Avec la venue de Qt4 il est maintenant possible de créer des applications GPL pour Microsoft Windows.


    C'est sur qu'avant, ce n'était pas possible...
    • [^] # Re: C'est sur...

      Posté par  . Évalué à 3.

      il a oublié de préciser avec Qt.

      Ce qu'il a aussi oublié c'est que c'est encore impossible pour le moment de créer des applis GPL (suafe accord avec Trolltech) avec PyQt puisque la version actuelle ne supporte encore que Qt 3.3.5 (non GPL).
      http://www.riverbankcomputing.co.uk/pyqt/index.php(...)

      Note that PyQt does not yet support Qt v4.


      Bref pas la pein d'esperer utilser les nouveauté Qt4 sous pyhton pour le moment.
      Vivement le PyQt v4 !
  • # Tuto

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

    Ton tutorial est plutôt sympathique et si moi-même je n'étais pas déja accroc au PyQt, je serais tenté d'y goûter devant l'élégance du language.

    Par contre, je ne peux que tu conseiller de sous classer la classe de ton interface créé avec QtDesigner. Car si tu as modifié le fichier généré avec pyuic et que plus tard du décides de modifier l'interface créée avec qtdesigner, à la recompilation du .ui tu vas perdre ce que tu avais auparavant ajouté dans le source python résultant.
    • [^] # Re: Tuto

      Posté par  . Évalué à 1.

      Ha oui tiens, je n'avais pas pensé à cette solution. C'est est une excellente !

      Sinon j'en vois deux autres possibles.


      Ne pas écrire de code dans l'interface du tout, comme c'est le cas dans cette exemple.
      Il est possible d'écrire du Python directement dans Qt Designer...


      Dans tout les cas, il ne vaudrait mieux pas trop mettre trop de code dans les interfaces graphiques.
    • [^] # Re: Tuto

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

      Par contre, je ne peux que tu conseiller de sous classer la classe de ton interface créé avec QtDesigner. Car si tu as modifié le fichier généré avec pyuic et que plus tard du décides de modifier l'interface créée avec qtdesigner, à la recompilation du .ui tu vas perdre ce que tu avais auparavant ajouté dans le source python résultant.


      Le fichier .ui.h est là pour ça ! Ca évite de se prendre la tête avec des héritages, en en plus le fichier est modifiable avec n'importe quel éditeur (QtDesigner détecte qu'il a changé, le recharge, et ajoute automatiquement les fonctions).
      • [^] # Re: Tuto

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

        Ca évite de se prendre la tête avec des héritages

        D'oh ! On m'aurait menti l'héritage ca prend la tête ?
        Dingue, je voyais ca comme une révolution dans la conception "propre" des programmes. Heureusement que tu m'ouvre les yeux :)
        • [^] # Re: Tuto

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

          Bah ouais on t'as surement menti, l'héritage est rarement la solution la plus propre ! C'est une manie que les profs d'UML inculquent aux étudiants (va savoir pourquoi), mais la plupart du temps il vaut mieux utiliser une composition (avec le pattern Bridge) pour séparer l'implémentation de l'interface.

          Pour en revenir au sujet, c'est totalement inutile d'avoir une classe qui ne sert à rien faite avec QtDesigner et avoir une classe fille spécifique. D'abord ça fait plus de code, ensuite c'est plus long à executer (parceque l'héritage demande une traduction dynamique des adresses des fonctions, qui prend beaucoup de temps ; c'était un dès gros problème de KDE avant l'invention de kdeinit) et enfin, comme expliqué dans le premièr paragraphe, c'est rarement la solution la plus "propre" UMLement parlant.
  • # interessant ...

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

    Je ne jure que par python et pygtk ... (et avant ça ; python et wxpython)
    Je n'ai encore jamais gouté à pyqt ...
    mais c'est dans mes projets, je vais garder ton tuto sous le coude, mais il aurait été interessant d'avoir les fichiers en downloadable ;-)

    Je ne sais pas si tu connais "tepache.py" ... ça prends en entrée un fichier glade (fichier xml, d'un GUI construit avec glade2), et ça génère un fichier python, prêt à l'emploi (utilisant le glade pour batir le gui)...

    Après t'as plus qu'à mettre du code dedans (remplir les events, et le constructor)... mais l'avantage de tepache, c'est que tu peux modifier ton ".glade", et regenerer le python sans rien casser à ton code (il path à coup de diff les modifs)

    Je n'ai pas trouvé plus simple pour faire du GUI ... mais je tenterai pyqt à l'aide de ton tuto ...
    http://primates.ximian.com/~sandino/python-glade/(...)
    • [^] # Re: interessant ...

      Posté par  . Évalué à 2.

      Il faut aussi ajouter qu'avec Qt il doit être possible de construire dynamiquement l'interface à partir du fichier ".ui" grâce à la classe QWidgetFactory :

      http://doc.trolltech.com/3.3/qwidgetfactory.html#create(...)

      J'ai essayé de l'utiliser mais je ne suis pas arrivé exactement à ce que je voulais donc j'ai utilisé le programme de conversion ui->py.

      La solution dynamique est, à mon goût, encore plus élégante et flexible puisque que l'on peut modifier l'interface de l'application sans même devoir recomplier quoi que ce soit.

      Encore un fois il me semble qu'un fichier d'interface ne devrait pas contenir de code. Je ne vois pas vraiment d'applications utils à cela.

      Avez vous des contre-exemples ?
    • [^] # Re: interessant ...

      Posté par  . Évalué à 2.

      Peut tu me dire pourquoi tu est passé de wxPython à pygtk ?
      • [^] # Re: interessant ...

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

        en fait, avant j'étais sous win principalement ...
        donc, wx me plaisait, dans le sens où il s'adaptait au "look" du système hôte ... ça me convenait bien ...
        mais pour faire du multi-plateforme, j'ai totallement déchanté, car il y avait beaucoup d'adaptation à faire pour que le code marche à l'identique sur win/nux ;-( (de plus, wx est principalement développé sous win .. ça se sent bien ! il y a même des modes de certains widgets qui ne fonctionne pas du tout en gtk)
        maintenant, depuis un an, j'ai totallement switché (et ne regrette rien)
        je suis passé définitivement à ubuntu/gnome ... et donc gtk inside ;-)

        J'ai porté mon appli en gtk, pour voir ... et elle marchait tel quel, que ce soit sous nux ou sous win ... (là ça m'a bien bluffé ...)

        mais j'ai surtout apprécié le design des api gtk ... et la séparation forte entre le contenu et le contenant (treestore et treeview) ...
        la communauté pygtk est vraiment sympa ... mailing-liste, et leur aboslument formidable "pygtk faq" (mis à jour perpetuellement ... où il y a toutes les questions qu'on peut se poser !!)

        de plus, la méthode de tigrux (tepache) ... bientôt intégré dans gazpacho, lui même intégré bientot dans PIDA ... ce ne sera que du bonheur ...

        voili voilà ... concernant les commentaires "on ne met pas de code dans l'interface" ... je suis entièrement d'accord ... et c là où tepache fait fort ...
        il ne fait que construire une enveloppe, qui dans sont __init__, va charger le glade et l'interprété pour constituer tous les objets visuellement ...
        après, dans l'enveloppe, on a que les evenements bindé dans glade2, à remplir ... ça va très vite ...
    • [^] # Re: interessant ...

      Posté par  . Évalué à 3.

      "mais il aurait été interessant d'avoir les fichiers en downloadable"

      Mais c'est le cas, respectivement


      Uniquement les sources : http://dosimple.ch/articles/Python-PyQt/tuto.zip(...)
      Une version windows générée via py2exe : http://dosimple.ch/articles/Python-PyQt/standalone.zip(...)
    • [^] # Comparatif par l'exemple

      Posté par  . Évalué à 3.

      Une chose intérressante serait de faire la même chose en Gtk et Qt pour un programme pas trops compliqué. On pourrait ainsi comparer les deux.
  • # un cardriciel...

    Posté par  . Évalué à 1.

    c'est quoi exactement ?
    mais mon ami Google est laconique
    http://www.google.fr/search?q=cardriciel&sourceid=mozilla-searc(...)
    • [^] # Re: un cardriciel...

      Posté par  . Évalué à 2.

      Faut dire que si tu cherches cardriciel à la place de cadriciel, tu vas avoir du mal.

      http://fr.wikipedia.org/wiki/Cadriciel(...)
      • [^] # Re: un cardriciel...

        Posté par  . Évalué à 2.

        désolé j'ai fait un copier/coller extrait de son tuto :) et y 'a comme une faute
    • [^] # Re: un cardriciel...

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

      C'est un logiciel tres crade...

      /o\
    • [^] # Re: un cardriciel...

      Posté par  . Évalué à 2.

      D'autres remarques:


      Le framework Qt offre également beaucoup d’autres services
      ...
      Le deécouplage de l’interface utilisateur et de l’application améliore
      ...
      Choisissez les options pas défaut pour obtenir une
      ...
      Renommerz ensuite ces éléments avec
      ...
      Faites un "horizontal layout" a
      ...
      les boutons "ajouter supprimer"
      ...
      avec les deux composants restants
      ...
      le bouton "modifier".
      ...
      Afin de pouvoir utiliser les informations
      ...


      Sinon , pourquoi n'utilises tu pas le module pickle pour sauvegarder tes objets directement ?
      Pourquoi n'utilises tu pas une liste en compréhension pour listerClient ?
      • [^] # Re: un cardriciel...

        Posté par  . Évalué à 1.

        Merci beaucoup pour ces corrections.

        Je suis débutant en Python et ce dont tu me parles m'est inconnu. Pourrais-tu en dire plus ?
        • [^] # Re: un cardriciel...

          Posté par  . Évalué à 2.

          Le module pickle te permet de sérialiser/désérialiser directement des objets (yc ompris des objets complexes genre listes hash, ... ), c'est à dire de les enregistrer/récupérer simplement sans prévoir de code à cet effet.

          dans ta classe carnet


          class carnet:
          def __init__(self,filename):
          self.clients = []
          # restauration du carnet de client depuis le fichier "filename"
          f=open(filename,'r')
          sellf.clients =pickle.load(f)
          f.close()

          def sauver(self):
          f = file(self.filename,'w')
          pickle.dump(self,f)
          f.close()


          dans ta classe client tu vires la méthode sauver

          plus d'info ici sur pickle
          http://www.python.org/doc/2.4.2/lib/module-pickle.html(...)
          Là ou ca se complique c'est lorsque tu veux sérialiser plusieurs objets avaec des références croisées.
          Il faut veiller à avoir un seul point d'entrée donc une strucure englobante.
          Inconvénient tu enregistres à chaque fois la totalité de ton conteneur au lieu de n'enregistrer que ce qui change.
          L'étape d'après c'est les bases de données mais pour un tuto ou un hack su le coin de la table c'est bien pratique

          D'une manière générale n'hésite pas à piocher ici avant de te lancer dans le code
          http://www.python.org/doc/2.4.2/modindex.html(...)

          Pour les listes en compréhension tout est expliqué sur le tutoriel de Guido
          http://www.python.org/doc/2.4.2/tut/node7.html#SECTION0071400000000(...)
          • [^] # Re: un cardriciel...

            Posté par  . Évalué à 2.

            correction:


            pickle.dump(self.clients,f)


            J'ai oublié de préciser un autre avantage de pickle:
            tu n'es pas obligé de modifier de code pour sauvegarder lorsque tu modifies la structure de tes classes
          • [^] # Re: un cardriciel...

            Posté par  . Évalué à 1.

            Oki, j'ai mis à jour l'article et les sources. Pour ce qui est du truc généré avec py2exe pour windows, c'est pas encore le cas.

            Merci de ces précisions, j'ai du gagner quelque lignes et comme tu le dit, le programme est maintenant plus flexible car il est plus simple de rajouter de nouveaux champs de saisie.
      • [^] # Re: un cardriciel...

        Posté par  . Évalué à 2.

        Ah et encore une


        et leurs coordonnées dans une listes.


        Sinon je te félicite aussi pour la qualité de ton tutoriel.
        C'est vraiment agréable à lire, bien présenté et pour un débutant en python tu ne dois pas l'être en programmation car ta séparation couche présentation / métier est clean.

        Sinon j'ai vu que tu as intégré l'appel au module pickel mais pourquoi as-tu écrit le code ?


        if(not os.path.exists(filename)):
        f = file(filename,'w')
        pickle.dump(self.clients,f)

        A quoi te sert de créer le fichier vide lors de la creation de l'objet carnet ?
        • [^] # Re: un cardriciel...

          Posté par  . Évalué à 2.

          Cette fois c'est vraiment nickel

          Encore 3 détails et je te fais de la pub


          Le découplage de l’interface utilisateur et de l’application améliore l’abstraction et donc que les composants sont ré-utilisablesréutilisables
          ...

          Pour créer l’application il faut une fenêtre principale, choisissez "Main Window".


          et tu pourrais peut-être faire un lien sur la bible pour ceux qui voudraient approfondir
          http://www.opendocs.org/pyqt/(...)
          • [^] # Re: un cardriciel...

            Posté par  . Évalué à 2.

            C'est plus fort que moi


            On dirait presque qu’il s’agit du langage natif de Qt.




            class carnet:
            ...

            def supprimer(self,indice):
            del self.clients[indice]

            ...

            def __repr__(self):
            return "\n".join(self.listerClients))


            Bon je vais me coucher ca vaudra mieux

            ==========>[ ]
            • [^] # Re: un cardriciel...

              Posté par  . Évalué à 1.

              Et voilà, c'est fait. Ce que me donne un code de 150 lignes avec les commentaires. Sympa :D.
  • # Sympathique....

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

    Ce 'petit' didacticiel est très sympathique ! J'ai bien aimé la façon dont les screenshots sont agrandies.

    Ma petite contribution : en dessous de la 1ère image (celle de l'appli finale) tu as écrit 'sandalone' au lieu de 'standalone'.
  • # Remarque

    Posté par  . Évalué à 1.

    très bonne initiative ce tuto, je vais le lire avec attention (bien que fan a priori de pygtk :-)

    Une remarque toutefois, dans le "constructeur"' de carnet j'ai vu :

    f = file(filename,'r')
    for l in f.readlines():
    [snip]


    Je crois que la technique la plus actuelle (et la plus optimale) est de faire simplement :

    f = file(filename,'r')
    for l in f:


    Tout ça gràce à la magie du file object qui est itérable (f.next() te renvoie la ligne suivante)
    • [^] # Re: Remarque

      Posté par  . Évalué à 1.

      Oki, je ne savais pas cela. Merci.
  • # Cadriciel

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

    "Cadriciel", mais jusqu'ou iront ils ?

    (putain serieux arretez, a chaque fois que vous utilisez une francisation POURRIE, vous mettez le terme anglais a coté, autant ne mettre que le terme anglais, puisque c'est celui que tout le monde comprend, non ?) (ahaha cadriciel quoi :)
    • [^] # Re: Cadriciel

      Posté par  . Évalué à 0.

      Je trouve cadriciel très claire. Personnelement j'ai tout de suite compris qu'il signifiais "framework". Littéralement cadre de travail... Mais framework en anglais n'est pas utilisé que dans l'informatique. Cadriciel est plus précis ... Pourquoi alors utiliser un mots anglais que nous comprenond de travers plutôt que d'utilser un mots français plus précis ?

      À propos, tu aurais pas une idée à propos de la traduction de "standalone" ?
      • [^] # Re: Cadriciel

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

        "Je trouve cadriciel très claire". "qu'il signifiais" "que nous comprenond" " plutôt que d'utilser" "un mots"
        5 fautes en 4 lignes.
        (bon c'etait pour montrer que bien que contre la francisation a outrance, je sais parler francais) (sauf les accents). Bref.

        Non "cadriciel" n'est pas correct du tout. Framework, ca serait plutôt "environnement de travail". Comme tu le dis, ce n'est pas utilisé que dans l'informatique. De plus, pour l'exemple qu'on a ici, Qt n'est pas a proprement parler un logiciel, mais une bibliotheque. Donc la "traduction" est elle meme erronée. Le terme anglais ne l'est pas.

        Si un jour (et j'en doute fortement) (et je ne l'espere pas du tout du tout), les "jeunes" apprennent les mots informatiques en francais, il faudra qu'ils reapprennents les memes termes en anglais, en allemand, en italien, en turque, etc etc. Le chauvinisme n'est pas une bonne chose du tout, mis a part pour perdre son temps a inventer, a utiliser, et ensuite a apprendre les 2 facons de dire la meme chose. Pourquoi ne pas apprendre directement le terme le plus "correct", et le plus utilisé ?

        (je rapelle le terme "deverminer" par exemple, "traduction" de "to debug". 'Vous' avez deja utilisé "bogue" comme traduction a "bug" (aucune racine etymologique, mais passont). Donc "deboguer" ne vous paraissait pas logique ? non, il fallait compliquer encore. Les exemples ne manquent pas, franciser les termes techniques ne mene a rien du tout, sauf à embrouiller tout le monde et a rendre plus difficile la comprehension du gentil monde qui nous entoure.

        (voila).
        (j'ai bien fais quelques fautes, qu'on puisse me les reprocher ...)
        • [^] # Re: Cadriciel

          Posté par  . Évalué à 0.

          cadriciel != framework

          framework == cadre de travail

          cadriciel == cadre de travail logiciel

          Qt est un logiciel : http://fr.wikipedia.org/wiki/Logiciel(...)

          Et c'est aussi un cadre de travail (framework) donc c'est un cadriciel.

          Et pour standalone, aucune suggestion ?
          • [^] # Re: Cadriciel

            Posté par  . Évalué à 10.

            standalone == autonome o:)
        • [^] # Re: Cadriciel

          Posté par  . Évalué à 0.

          > (j'ai bien fais quelques fautes, qu'on puisse me les reprocher ...)

          Pas de problème... si tu es demandeur :
          - j'ai bien fait (dans la phrase citée)
          - passons
          - en turc (rhoh !)
      • [^] # Re: Cadriciel

        Posté par  . Évalué à 3.

        standalone = le programme directement utilisable

        ?

Suivre le flux des commentaires

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