Dorian Fevrier's blog - Mot-clé - wxpythonJe m’appelle FEVRIER Dorian, je suis infographiste 3D passionné par mon métier, l’informatique en général, l’internet, la programmation et l’évolution de tout ce petit monde. Vous trouverez sur ce blog des tutoriaux, mes coups de cœurs, avis, etc.2024-01-02T23:48:05+01:00FEVRIER Dorianurn:md5:695d9c73474c33ce3dab043823509c4bDotclearUtiliser PyQt dans Mayaurn:md5:0b9e83f1e4e9b7fdb060331a26353b7b2009-07-18T22:45:00+02:002013-07-26T22:40:12+02:00NarannScript et code32bits64bitsfrmayamelpyqtpythonqtwxpython<p><img src="https://www.fevrierdorian.com/blog/public/logos/QtPython_logo001.png" alt="QtPython_logo001.png" style="float:left; margin: 0 1em 1em 0;" title="QtPython_logo001.png, juil. 2009" height="150" width="150" />Vous ne vous êtes jamais dis: "Arf! Le MEL c'est cool mais ça commence à être un peu has been...".</p>
<p>Personnellement, je me fait cette réflexion assez souvent... :hehe: Même si on arrive à avoir ses petites habitude de GUI (certaines sont des bijoux d'inventivité), il n'est pas inintéressant de se pencher sur ce qui ce fait de plus... Comment dire... Jeune...</p>
<p>Je vous invite donc à découvrir comment intégrer PyQt dans Maya.</p> <p>Lors de mes nombreuses recherches d'informations sur l'API Python dans Maya, je suis tombé sur un post d'un utilisateur qui donnait un code d'exemple pour utiliser PyQt dans Maya. J'ai tous de suite été interpellé. J'avais eu l'occasion de faire du Qt, j'avais abandonné tellement ça m'avais donné des boutons à l'époque. Je débutait en C++ et j'avais déjà du mal à encaisser le coup. Et croyez moi, développer une GUI en C et C++, c'est pas du MEL... Mais j'avais été très impressionné par la doc, les exemples, et les possibilités offerte...</p>
<p>C'est donc avec une certaine curiosité que je me suis penché sur ce post.</p>
<h5>QTCkoi?</h5>
<p><a href="http://fr.wikipedia.org/wiki/Qt" hreflang="fr">C'est sur wikipedia</a>! (Un peu de lecture pour vous = Grosse flegme pour moi! :marioCours: )</p>
<p>Pour faire cours, il s'agit d'un <a href="http://fr.wikipedia.org/wiki/Framework" hreflang="fr">framework</a>, un ensemble de lib livré en "pack" qui vous permet de faire quasiment tout...</p>
<h5>Remarque</h5>
<p>Avant de commencer, sachez que je n'ai testé opération uniquement sur un Maya 32bits, d'après la doc il semble qu'il soit possible de faire fonctionner le module sur un Maya x64 mais il faut faire deux trois choses que je n'ai même pas lu. La documentation "officiel" d'Autodesk est disponible dans:</p>
<pre>
C:\Program Files\Autodesk\Maya2009\devkit\other\PyQtScripts</pre>
<p>On peut commencer.</p>
<h5>Let's Go!</h5>
<p><img src="https://www.fevrierdorian.com/blog/public/logos/4947-frenetik-Pythoncrystal.png" alt="4947-frenetik-Pythoncrystal.png" style="display:block; margin:0 auto;" title="4947-frenetik-Pythoncrystal.png, juil. 2009" height="256" width="256" />
Pour que tout ça marche il faut dans un premier temps installer la même version de l'interpréteur Python que Maya, à savoir la "branche" 2.5.x:</p>
<p><a href="http://www.python.org/download/releases/" hreflang="en">http://www.python.org/download/releases/</a></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_001.png" alt="PyQt_install_001.png" style="display:block; margin:0 auto;" title="PyQt_install_001.png, juil. 2009" height="228" width="319" /></p>
<p>Le troisième numéro étant le numéro des mises à jour critique, ça ne changera rien au fonctionnement.</p>
<p>Installez la version x86:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_002.png" alt="PyQt_install_002.png" style="display:block; margin:0 auto;" title="PyQt_install_002.png, juil. 2009" height="251" width="429" /></p>
<p>Note au utilisateurs de Python >2.5 il n'est pas nécessaire de cocher l'option "Register Extensions" pour que la manipulation fonctionne (désactiver cette option vous permet de continuer à avoir votre version de Python actuel par défaut).</p>
<h5>PyQt</h5>
<p><img src="https://www.fevrierdorian.com/blog/public/logos/RiverBanklogo.png" alt="RiverBanklogo.png" style="display:block; margin:0 auto;" title="RiverBanklogo.png, juil. 2009" height="100" width="100" /></p>
<p>Le plus simple est fait. Maintenant il va falloir aller sur le site de PyQt afin de savoir quel version de Qt télécharger. En effet, PyQt ne s'occupe que de faire le lien entre Python et Qt. Il faudra donc installer Qt en premier puis PyQt ensuite. Mais avant nous devons savoir quel version de Qt la dernière version de PyQt supporte (on s'accroche!).</p>
<p>Allez donc sur <a href="http://www.riverbankcomputing.co.uk/software/pyqt/intro" hreflang="en">le site de PyQt</a>:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_006.png" alt="PyQt_install_006.png" style="display:block; margin:0 auto;" title="PyQt_install_006.png, juil. 2009" height="146" width="379" /></p>
<p>La dernière version pour Python 2.5 (la version utilisé par Maya) est donc la version 4.4.3. Téléchargez là mais ne l'installez pas.</p>
<h5>Qt</h5>
<p><img src="https://www.fevrierdorian.com/blog/public/logos/Qt_logo002.png" alt="Qt_logo002.png" style="display:block; margin:0 auto;" title="Qt_logo002.png, juil. 2009" height="217" width="217" />
Une fois que c'est fait, il nous faut aller sur le <a href="http://www.qtsoftware.com/" hreflang="en">site de Qt</a>, dans la section <a href="http://www.qtsoftware.com/downloads/" hreflang="en">download</a>. Mais ne téléchargez rien! En effet, par défaut, le site vous invite à télécharger la dernière version du framework (4.5.2 à l'heure ou j'écris ses lignes)... Tout comme Maya n'utilise pas la dernière version de Python (3.1) et que nous n'avons donc pas télécharger la dernière version de Python. Et bien nous allons devoir ruser un peu.</p>
<p>La méthode la plus simple (celle que j'ai appliqué) consiste à commencer le téléchargement:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_003.png" alt="PyQt_install_003.png" style="display:block; margin:0 auto;" title="PyQt_install_003.png, juil. 2009" height="303" width="320" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_004.png" alt="PyQt_install_004.png" style="display:block; margin:0 auto;" title="PyQt_install_004.png, juil. 2009" height="299" width="498" /></p>
<p>Il ne suffit ensuite plus qu'a copier l'url.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_005.png" alt="PyQt_install_005.png" style="display:block; margin:0 auto;" title="PyQt_install_005.png, juil. 2009" height="107" width="555" /></p>
<p>Et avec un peut de jugeote, on peut le modifier suivant ce qu'on cherche, à savoir:</p>
<pre>
http://get.qtsoftware.com/qt/source/qt-win-opensource-4.5.2-mingw.exe</pre>
<p>Devient:</p>
<pre>
http://get.qtsoftware.com/qt/source/qt-win-opensource-4.4.3-mingw.exe</pre>
<h5>Pas terrible la méthode...</h5>
<p>Oui! Ça, c'était la méthode que j'ai trouvé la plus simple.</p>
<p>Qt propose une autre méthode qui consiste à aller "fouiller" dans le ftp du site... Franchement, c'est moyen mais si vous vous sentez l'ame d'un Indiana Johns, allons y.</p>
<p>Dans la page principal des download, en bas a droite:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_007.png" alt="PyQt_install_007.png" style="display:block; margin:0 auto;" title="PyQt_install_007.png, juil. 2009" height="347" width="334" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_008.png" alt="PyQt_install_008.png" style="display:block; margin:0 auto;" title="PyQt_install_008.png, juil. 2009" height="380" width="303" /></p>
<p>(Petite musique d'Indiana Johns en fond) On fait moins le malin là! :mechantCrash:</p>
<p>Comme je suis gentil, je vous donne le chemin:</p>
<pre>
ftp://ftp.qtsoftware.com/qt/source/qt-win-opensource-4.4.3-mingw.exe</pre>
<p>Maintenant que vous l'avez, c'est bon, installez le, vous avez le droit!!!</p>
<p>Petite subtilité au moment de l'install:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_009.png" alt="PyQt_install_009.png" style="display:block; margin:0 auto;" title="PyQt_install_009.png, juil. 2009" height="47" width="394" /></p>
<p>Cochez la case si vous n'avez pas MinGW (c'est un compilateur. A priori on n'en à pas besoin mais ça me semble plus "propre" de procéder ainsi).</p>
<p>Lancez l'installe:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_009b.png" alt="PyQt_install_009b.png" style="display:block; margin:0 auto;" title="PyQt_install_009b.png, juil. 2009" height="386" width="503" /></p>
<p>A la fin, je vous invite à regardez les exemples histoire de voir ce qu'il est possible de faire. :sourit:</p>
<h5>Petites Manips Importantes</h5>
<p>Il faut "setter" les variables d'environnement. Normalement, ceci est fait automatiquement durant l'installation mais mon système étant en 64 bits (Vista x64), il me semble qu'elle n'ont pas été enregistrer. Heureusement, Trolltech à pensé à nous et il vous suffira de lancer:</p>
<pre>
C:\Qt\4.4.3\bin\qtvars.bat</pre>
<p>Avec des droits administrateur pour faire tout ça à votre place.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_011.png" alt="PyQt_install_011.png" style="display:block; margin:0 auto;" title="PyQt_install_011.png, juil. 2009" height="173" width="392" /></p>
<p>Ensuite lancez l'installation de PyQt-Py2.5-gpl-4.4.3-1.exe et laissez toute les options par défaut (si Python 2.5 est bien installé tout devrait se passer sans problème).</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_010.png" alt="PyQt_install_010.png" style="display:block; margin:0 auto;" title="PyQt_install_010.png, juil. 2009" height="216" width="247" /></p>
<p>Lancer les exemples (c'est un peu long à se lancer la première fois donc pas d'inquiétude).</p>
<p>Note: Pour les utilisateurs qui n'aurait pas "registré" Python à l'installe de Python 2.5, vous remarquerez que les exemples PyQt ne se lance pas... Bon, perso j'ai quand meme mis 10 minutes avant de comprendre que Windows essayait de les lancez avec la version actuellement enregistré sur mon OS, à savoir: Python 3.1... Pour lancer les exemples, la solution la plus simple semble être d'ouvrir un invite de commande et de lancer quelque chose comme:</p>
<pre>
C:\Python25>python.exe C:\Python25\Lib\site-packages\PyQt4\examples\tools\qtdemo\qtdemo.pyw</pre>
<p>Bon, c'est cool mais pour vous rendre compte des "limitations" (comparé à Qt "normal"), essayez l'exemple Thread/Mandelbrot sur Qt et PyQt... Ça n'a juste rien à voir (En même temps on n'installe pas Qt pour faire des fractals sous Maya...).</p>
<h5>Copie-Colle</h5>
<p>Dernière étape, il nous faut copier quelques fichiers du répertoire Python 2.5 vers le répertoire Python de Maya.</p>
<p>Allez dans:</p>
<pre>
C:\Python25\Lib\site-packages</pre>
<p>Sélectionnez PyQt4 et sip.pyd.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_012.png" alt="PyQt_install_012.png" style="display:block; margin:0 auto;" title="PyQt_install_012.png, juil. 2009" height="163" width="295" /></p>
<p>Copiez les dans:</p>
<pre>
C:\Program Files\Autodesk\Maya2009\Python\Lib\site-packages</pre>
<p>Program Files (x86) si comme moi vous êtes sur un OS x64.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_013.png" alt="PyQt_install_013.png" style="display:block; margin:0 auto;" title="PyQt_install_013.png, juil. 2009" height="207" width="323" /></p>
<h5>Takeoff!</h5>
<p>Lancez Maya (32bits), ouvrez le Script Editor.</p>
<p>Faites un:</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> PyQt4</pre>
<p>Lancez:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_014.png" alt="PyQt_install_014.png" style="display:block; margin:0 auto;" title="PyQt_install_014.png, juil. 2009" height="419" width="224" /></p>
<p>Vous avez gagné!!!</p>
<h5>Dernier exemple</h5>
<p>Bon, ce billet avait juste pour vocation de vous montrer qu'on pouvait utiliser Qt dans Maya à l'aide de PyQt. Je ne compte pas faire de tutos sur PyQt mais je vous invite à faire vos scripts (envoyez les moi, je les publierai sur cette page) voir mieux, à faire des tutoriaux la dessus!</p>
<p>En attendant, je vous donne un script que j'ai trouvé sur un Google Groupe destiné à Python Dans Maya (ça ressemble un peu à Tkinter):</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">__future__</span> <span style="color: #ff7700;font-weight:bold;">import</span> division
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">math</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> PyQt4.<span style="color: black;">QtCore</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> PyQt4.<span style="color: black;">QtGui</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">class</span> Form<span style="color: black;">(</span>QDialog<span style="color: black;">)</span>:
<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">(</span><span style="color: #008000;">self</span>, parent=<span style="color: #008000;">None</span><span style="color: black;">)</span>:
<span style="color: #008000;">super</span><span style="color: black;">(</span>Form, <span style="color: #008000;">self</span><span style="color: black;">)</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">(</span>parent<span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">browser</span> = QTextBrowser<span style="color: black;">(</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span> = QLineEdit<span style="color: black;">(</span><span style="color: #483d8b;">"Type an expression and press Enter"</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span>.<span style="color: black;">selectAll</span><span style="color: black;">(</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;">#Select all texts </span>
layout = QVBoxLayout<span style="color: black;">(</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;">#Main Layout</span>
layout.<span style="color: black;">addWidget</span><span style="color: black;">(</span><span style="color: #008000;">self</span>.<span style="color: black;">browser</span><span style="color: black;">)</span>
layout.<span style="color: black;">addWidget</span><span style="color: black;">(</span><span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">setLayout</span><span style="color: black;">(</span>layout<span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span>.<span style="color: black;">setFocus</span><span style="color: black;">(</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">connect</span><span style="color: black;">(</span><span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span>, SIGNAL<span style="color: black;">(</span><span style="color: #483d8b;">"returnPressed()"</span><span style="color: black;">)</span>,
<span style="color: #008000;">self</span>.<span style="color: black;">updateUi</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">setWindowTitle</span><span style="color: black;">(</span><span style="color: #483d8b;">"Farsheed Calculater"</span><span style="color: black;">)</span>
<span style="color: #ff7700;font-weight:bold;">def</span> updateUi<span style="color: black;">(</span><span style="color: #008000;">self</span><span style="color: black;">)</span>:
<span style="color: #ff7700;font-weight:bold;">try</span>:
text = <span style="color: #008000;">unicode</span><span style="color: black;">(</span><span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span>.<span style="color: black;">text</span><span style="color: black;">(</span><span style="color: black;">)</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">browser</span>.<span style="color: black;">append</span><span style="color: black;">(</span><span style="color: #483d8b;">"%s = <b>%s</b>"</span> <span style="color: #66cc66;">%</span> <span style="color: black;">(</span>text, <span style="color: #008000;">eval</span><span style="color: black;">(</span>text<span style="color: black;">)</span><span style="color: black;">)</span><span style="color: black;">)</span>
<span style="color: #ff7700;font-weight:bold;">except</span>:
<span style="color: #008000;">self</span>.<span style="color: black;">browser</span>.<span style="color: black;">append</span><span style="color: black;">(</span>
<span style="color: #483d8b;">"<font color=red>%s is invalid!</font>"</span> <span style="color: #66cc66;">%</span> text<span style="color: black;">)</span>
app = QApplication<span style="color: black;">(</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">)</span>
form = Form<span style="color: black;">(</span><span style="color: black;">)</span>
form.<span style="color: black;">show</span><span style="color: black;">(</span><span style="color: black;">)</span>
app.<span style="color: black;">exec_</span><span style="color: black;">(</span><span style="color: black;">)</span></pre>
<p>Par monsieur Farsheed Ashouri, merci à lui :bravo:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_015.png" alt="PyQt_install_015.png" style="display:block; margin:0 auto;" title="PyQt_install_015.png, juil. 2009" height="413" width="450" /></p>
<h5>Et en prod?</h5>
<p>Nous y voila, la grande question. Et bien oui, maintenant qu'on s'est cassé le derrière à intégrer tout ça, pourquoi ne pas l'utiliser en prod?</p>
<p>Et bien en ce qui me concerne je pense que c'est une question "de confiance"... En effet, Il y a pas mal d'acteurs qui sont en jeux: Trolltech (Qt), River Bank Computing (PyQt) et Autodesk. Un peut trop celons moi. En effet, le gros problème quand on utilise un binding Python d'un autre projet (par exemple: wxWidget -> wxPython), c'est qu'on est dépendant du bon vouloir des développeurs du bind... Dans le cas de wxPython (voir <a href="https://www.fevrierdorian.com/blog/index.php?post/2009/03/10/Tkinter%2C-vous-aussi%2C-faites-des-GUI-en-Python...-Ouai%2C-mes-fesses-ouai...#Toujours_plus">un ancien billet</a>), les développeurs ne semblait pas chaud à l'idée de passer le projet en Python 3.1 (River Bank Computing à franchis le pas mais c'est bien le seul que j'ai vu pour l'instant, il semble gagner de l'argent avec PyQt cela dis, ça doit surement aider).</p>
<p>Ajoutez à ça qu'il pourrait y avoir des bugs qui apparaissent typiquement en production (vous savez, quand on commence à "vraiment" utiliser un produit, rien ne marche)... Et ses bugs pourrait venir de Maya... Et a mon avis, là vous pouvez vous brosser pour qu'Autodesk résolve le truc... Vu qu'il s'agit aussi d'une ancienne version (Python 2.5 et donc Qt 4.4.3), il n'est pas dit que River Bank Computing soit réactif quand à la résolution des problèmes...</p>
<p>Bref, même si pour l'instant Maya 2009 est en Python 2.5, rien ne dit qu'il ne passera pas à Python 3.1 un jour... Et ce jour là, il faudra que les lib utilisés dans votre pipeline soit compatible au risque de ne pas pouvoir avancer dans les versions... En gros, ça fait un peu de monde à attendre et il est déjà assez dur comme ça d'évoluer un pip' à chaque version d'un logiciel sans s'ajouter des contraintes.</p>
<p>Un soft 3D à déjà un bon paquet de problèmes sans qu'on ait à s'ajouter des potentiels problèmes.</p>
<p>Je ne sais pas si c'est possible mais tant qu'à utiliser Qt (qui est un framework bien balèze à apprendre quand même), autant utiliser l'API Maya en C++. Ça me semble plus "logique": Ça permet de s'affranchir de PyQt et d'avoir des meilleurs perfs (a priori, si on prend Qt, c'est pour utiliser ses outils... Si c'est juste pour faire des boutons, autant utiliser le MEL).</p>
<p>En effet, je pense que quand on commence à intégrer un framework tel que Qt dans Maya (il faut déjà en avoir besoin...), c'est qu'on compte se lancer dans la durée et que les outils créés doivent (tant qu'a faire) être performant...</p>
<p>En ce qui me concerne, si j'avais un studio qui me posait cette question, la réponse serait quelque chose comme:</p>
<ul>
<li>Pourquoi Qt?</li>
<li>Les besoins ne peuvent pas être comblé en MEL?</li>
<li>Tu connait Qt? PyQt?</li>
<li>Combien de temps veut tu que tes outils dure? Le temps d'une prod? Durant toute la durée de vie du studio?</li>
</ul>
<p>A chacun de voir ;)</p>
<p>N'hésitez pas à donner votre avis sur la question (ou si vous avez eu des problèmes durant ce "tuto")</p>
<p>A bientôt!</p>
<p>Dorian</p>
<p>EDIT 2009 08 21: Dans la mesure ou les prochaines versions de Maya utiliseront pyQT pour les GUI (rien d'officiel mais c'est un secret de Polichinelle), cette conclusion est "deprecated", pire elle est complètement erroné. On peut donc sérieusement commencer à s'y intéresser. N'hésitez pas, si vous connaissez des liens vers des tutos pour pyQT spécifique à Maya! ;)</p>Tkinter: Vous aussi, faites des GUI en Python... Ouai, mes fesses ouai...urn:md5:530872bfaa7e3f875a1c8a456bce3cac2009-03-13T23:53:00+01:002013-07-26T22:41:38+02:00NarannScript et code32bits64bitsbidouilledossiersfichiersfiledialogfrocelotproductionpythonscripttrackingwxpython<p><img src="https://www.fevrierdorian.com/blog/public/ecureuilFileTrack/ecureuil_002.png" alt="ecureuil_002.png" style="float:left; margin: 0 1em 1em 0;" title="ecureuil_002.png, mar. 2009" height="150" width="150" />Travaillant actuellement sur un projet de <a href="http://fr.wikipedia.org/wiki/Michel_Ocelot" hreflang="fr">Michel Ocelot</a> (les incultes, cliquez sur le lien :bete: ), je fais une interface graphique pour un logiciel de "tracking de fichier". Ça consiste en gros à lister tous les fichiers d'un certain type (ex: ExxPxx_DecA.tif) dans une hiérarchie donnée (par exemple: Z:/Exx/Pxx/Decors) en ne changeant que quelques variables dans le chemin, ce qui permet d'avoir rapidement un aperçu de "qu'est-ce qu'il manque", de l'âge des fichiers, de savoir qui est plus récent que qui, etc... Super pratique donc! Mais je ne vais pas m'attarder sur le sujet trop longtemps (J'y reviendrai peut-être un jour si je fais une version "publique" et si ça intéresse quelqu'un...). Je voudrais vous parler de Python 3.0 et des problèmes que j'ai rencontrés (et que je rencontre encore à l'heure actuelle) concernant l'utilisation de tkinter. Problèmes qui se révèlent être un des cotés sombres de Python et des modules indépendants qui l'entourent.</p> <h5>Explications <a name="Explications"></a></h5>
<p>Comme je l'ai dit avant, <a href="https://www.fevrierdorian.com/blog/index.php?post/2008/12/23/Pyhton-dans-Maya...-Ou-l-inverse..." hreflang="fr">Python "cay bien"</a>, le seul problème ici c'est que j'ai fait le choix d'utiliser la version 3.0 qui n'est pas rétrocompatible... Cela dit, je m'en foutais dans la mesure où après avoir évalué mes besoins, je ne comptais utiliser que la ligne de commande (et je n'avais besoin que des librairies standards) :hehe: .</p>
<p>Bon, le projet commence, mes scripts marchent à merveille:</p>
<ul>
<li>Renommage des fichiers exportés par Final<del>caca</del>cut (Qu'on ne vienne pas me dire que Mac en prod ça déchire, j'ai un surplus d'arguments allant dans le sens inverse à gérer...)</li>
<li>Cherchage d'erreurs dans les nomenclatures des fichiers: "Pourquoi c'est là ça?", "Il manque un tiret à ton nom de fichier", etc...</li>
<li>Comparaison des fichiers et update par exécution de programme en ligne de commande automatiquement: "Fichier .tiff plus récent que fichier .map, conversion...", "Fichier .map absent mais fichier .tiff présent, conversion...", etc...</li>
<li>Frame "checkage": "Image E01P001_color.tiff de 0 octet", "Image E01P001_color.tiff de 128 octet -> Erreur mental ray probable", etc...</li>
</ul>
<p>Bref, que du bonheur... :youplaBoum:</p>
<h5>Toujours plus! <a name="Toujours_plus"></a></h5>
<p>Mais voila, au fur et à mesure de mon avancement, je me suis fait une lib de petites fonctions bien pratiques et j'ai voulu commencer à faire une petite interface graphique pour tout ça... En toute logique, je commence avec tkinter (une lib graphique vieille comme pas permis mais intégrée en standard à Python 3.0, je la trouve bien moins puissante que le mel, même pour des choses "simples"). Pour ce que je voulais faire (au début), c'était largement suffisant. Quelques colonnes et puis c'était bon...</p>
<p><img src="https://www.fevrierdorian.com/blog/public/ecureuilFileTrack/ecureuil_001.png" alt="ecureuil_001.png" style="display:block; margin:0 auto;" title="ecureuil_001.png, mar. 2009" height="372" width="628" /></p>
<p>Mais comme tout bon (ou mauvais) projet, on se met à vouloir (et devoir) faire évoluer son outil et les besoins en terme de "possibilités" grandissent... Bon, mon interface étant très simple, et voyant le truc venir, je commence à me tourner vers d'autres tool kits graphiques. Et là, je me prends un mur dans les dents (c'est l'effet Python 3.0), à savoir, tous les portages des librairies graphiques les plus connus sont actuellement sous Python 2.x. En effet, Python 3.0 n'était pas rétroactive, la plupart des projets sont frileux à l'idée de passer à la nouvelle version. J'ai trouvé <a href="http://lists.wxwidgets.org/pipermail/wxpython-users/2008-July/078115.html" hreflang="fr">un post</a> d'une personne qui semble être impliquée dans un projet (wxPython, on y reviendra) disant que le portage n'est pas prévu....</p>
<blockquote><p>- "Hi,
I was wondering if there are already any plans when or how wxPython
will support/start moving to python 3? Are there a lot of issues
involved with porting wxPython framework? (I don't mean user
programs.) I know it is still a bit early but as it is coming closer
maybe there is a roadmap already."</p>
<p>
- "Nothing solid yet. I've got a general idea of things that will likely
need to be done, but haven't yet confirmed any of it or done any real
investigations."</p></blockquote>
<p>Qu'a cela ne tienne, mes scripts étant relativement simples, je vire la version 3.0, installe la version 2.6.1 et corrige mes script pour les rendre compatibles: 15 minutes... Aux vues de l'investissement que ça représentait, je n'étais, à priori pas perdant au change dans la mesure où j'allais me retrouver avec une "vraie" lib graphique qui n'allait pas me limiter (comme le fait tkinter).</p>
<p>Après un aperçu rapide des <a href="http://python.developpez.com/outils/Librairies/?page=IHM" hreflang="fr">libs graphiques existantes</a> je remarque une certaine sympathie des utilisateurs pour la librairie <a href="http://www.wxpython.org/" hreflang="fr">wxPython</a>. En ayant déjà entendu parlé, je décide de m'y tenter.</p>
<h5>"Quand les emmerdes arrivent c'est moi qui interviens..." <a name="Quand_les_emmerdes_arrivent"></a></h5>
<p>J'installe tout ça (avec la "doc et démos" qui est extrêmement bien faite, et je pèse mes mots) et commence à lancer une fenêtre, tout marche bien mais dès que je place mon curseur sur la dite fenêtre, python plante (avec envois de rapport d'erreur et tout...). Je continue, utilise différents exemples... Défois ça marche, défois pas (ça fait très débordement de mémoire)... Je cherche sur le forum et je trouve un type <a href="http://www.developpez.net/forums/d697375/autres-langages/python-zope/gui/wxpython/pb-vista-p-python-2-6-p-wxpython/" hreflang="fr">dans le même cas que moi</a>, un système 64bits. Il renvoi à <a href="http://trac.wxwidgets.org/ticket/10082" hreflang="en">un rapport de bug</a>. Le problème est donc connu mais non résolu. C'est spécifique aux systèmes 64bits...</p>
<blockquote><p>"Same problem here with wxPython2.8-win32-unicode-2.8.9.1-py26 under Vista Ultimate x64. Simple applications crash as soon as one moves the mouse onto their window. More complicated applications seem to work fine. Even the demo crashes if you move the mouse onto the splashscreen. If you leave the mouse outside the spashscreen and let it disappear, the demo seams to run fine."</p></blockquote>
<p>Naïvement, je désinstalle mon wxPyhon et mon Python, tous deux en 64bits, puis réinstalle le tout en 32bits... Même problème. :mechantCrash:</p>
<p>Je commence à réfléchir aux alternatives et n'en voit qu'une seule: Passer à Python 2.5...</p>
<p>(Edit: Une personne <a href="http://morison.biz/technotes/articles/55" hreflang="en">semble avoir trouvé une solution</a> mais c'est pas ce qu'il y a de plus propre disons...)</p>
<p>Bon, là ça commence à me gonfler un peu. Après une longue réflexion, je décide de rester sous Python 3.0 avec tkinter. Pourquoi? J'en sais trop rien en fait... Ça me fait bizarre de repasser sous une ancienne version de Python. Mais surtout, j'ai pris conscience de quelque chose: le support est assuré uniquement sur les librairies standard... En gros, tous les portages ne sont pas assurés dans le temps (j'en veux pour preuve la grande quantité de lib python qui ne sont plus maintenus) ce qui fait que si on veut être sûr d'avoir quelques chose qui dure dans le temps, il faut rester sur les librairies standards.</p>
<h5>tkinter! <a name="tkinter"></a></h5>
<p>C'est ici que commence le billet en fait. Tout le début était une intro. :sauteJoie:</p>
<p>Je continue donc ma petite interface sous tkinter. Sauf que voila, la documentation est désastreuse...</p>
<p>Pour résumer, disons que:</p>
<ul>
<li>Il n'y a pas de "vrai doc ultime"</li>
<li>Elle est éparpillée sur le net</li>
<li>Les exemples datent et ne sont plus adaptés à Python 3.0 (L'effet Python 3.0 que je citais plus haut)</li>
</ul>
<p>On s'amuse donc comme un petit fou à tenter tout et n'importe quoi pour réussir certaines manipulations, à trouver une bride d'infos qu'on retranscrit comme on peut (j'ai du aller regarder directement dans les libs py pour savoir comment faire certaines choses :baffed: ). Allez trouvez un moyen de lancer une FileDialog sous Python 3.0, le truc de base à faire. J'ai cru qu'au final j'allais devoir me rescripter une FileDialog. Soit je suis nul, soit ça prouve que c'est un peu la misère, (non pas à faire, mais ça se devine pas... Et sans doc, on est comme un imbécile). Au final, on trouve mais en mettant en relation différentes documentations. Pour mon exemple:</p>
<ul>
<li>"FileDialog" est un sous module de tkinter (Doc1)</li>
<li>Il faut l'appeler avec "asksaveasfilename" (Doc2) (Ne me dites pas que ça se devine...)</li>
<li>L'attribut pour lui mettre un path par défaut est "initialdir" (Doc3)</li>
</ul>
<p>Super! Maintenant (après plus d'une heure), j'ai une FileDialog. :casseTeteMur:</p>
<p>La raison pour laquelle j'ai créé ce billet est la suivante: J'ai tellement galèré pour trouver des morceaux de documentation que je vous propose de les lister ci-dessous (Tout est en vrac mais au moins, vous en avez déjà pas mal).</p>
<ul>
<li><a href="http://fr.wikibooks.org/wiki/Programmation_Python/Tkinter" hreflang="fr">http://fr.wikibooks.org/wiki/Programmation_Python/Tkinter</a></li>
<li><a href="http://infohost.nmt.edu/tcc/help/pubs/tkinter/" hreflang="en">http://infohost.nmt.edu/tcc/help/pubs/tkinter/</a></li>
<li><a href="http://www-acc.kek.jp/WWW-ACC-exp/KEKB/control/Activity/Python/TkIntro/introduction/index.htm" hreflang="en">http://www-acc.kek.jp/WWW-ACC-exp/KEKB/control/Activity/Python/TkIntro/introduction/index.htm</a></li>
<li><a href="http://effbot.org/tkinterbook/" hreflang="en">http://effbot.org/tkinterbook/</a></li>
<li><a href="http://www.pythonware.com/library/tkinter/introduction/" hreflang="en">http://www.pythonware.com/library/tkinter/introduction/</a></li>
<li><a href="http://python.developpez.com/faq/?page=Tkinter" hreflang="fr">http://python.developpez.com/faq/?page=Tkinter</a></li>
<li><a href="http://python.developpez.com/cours/TutoSwinnen/" hreflang="fr">http://python.developpez.com/cours/TutoSwinnen/</a> (Chapitre 8, 13 et 15 mais beaucoup de "dessin")</li>
<li><a href="http://sebsauvage.net/python/gui/index_fr.html" hreflang="fr">http://sebsauvage.net/python/gui/index_fr.html</a></li>
<li><a href="http://python.developpez.com/sources/?page=Tkinter" hreflang="en">http://python.developpez.com/sources/?page=Tkinter</a></li>
<li><a href="http://www.java2s.com/Code/Python/GUI-Tk/CatalogGUI-Tk.htm" hreflang="en">http://www.java2s.com/Code/Python/GUI-Tk/CatalogGUI-Tk.htm</a></li>
<li><a href="http://www.tcl.tk/man/tcl8.5/TkCmd/contents.htm" hreflang="en">http://www.tcl.tk/man/tcl8.5/TkCmd/contents.htm</a></li>
<li><a href="http://www.manning.com/grayson/" hreflang="en">http://www.manning.com/grayson/</a> (Livre que je vais peut-être m'acheter en PDF)</li>
</ul>