<p class="spip"><a href="http://www.coagul.org/article.php3?id_article=407" class="spip_out">Dans le tutoriel précédent</a>, nous avons créé notre première application PyQt. Dans cet article, nous allons en fabriquer une nouvelle qui nous permettra de commencer à découvrir Python.</p>

<h3>Éléments abordés dans ce document</h3>
<p class="spip"> Les tuples « avec () »
<br /> Le transtypage « avec float() et `` »
<br /> Le formatage des chaînes de caractères « avec %»</p>

<h3>Au travail</h3>
<p class="spip">Maintenant que vous connaissez QT designer vous devriez pouvoir créer ceci
<span class='spip_document_784 spip_documents spip_documents_center' >
<img src='http://download.tuxfamily.org/assocoagul/drupal-files/spip/pyqt2-MetricConversion.jpg' width="369" height="302" alt="" /><span>
<span class='spip_document_785 spip_documents spip_documents_center' >
<img src='http://download.tuxfamily.org/assocoagul/drupal-files/spip/pyqt2-Connections.jpg' width="716" height="271" alt="" /></span><p>

<p class="spip">Pour plus de détails vous pouvez consulter <a href="http://doc.trolltech.com/3.3/designer-manual-2.html" class="spip_out">ce site</a></p>

<h3>Détail de l’implémentation</h3>
<p class="spip">Pour cette application, je vais utiliser les tuples  comme un tableau à 2 dimensions. Ce n’est peut-être pas la manière la plus élégante d’un point de vue Pythonien, mais pour l’instant je manque d’expérience sur le sujet. Et je dois reconnaître qu’on ne sort pas indemne de nombreuses années de développement en C puis PHP ;-).
L’idée consiste à remplacer les switchs proposés dans le code C++ par cette  structure de données. <a href="http://doc.trolltech.com/3.3/designer-manual-2.html" class="spip_out">(voir Coding the Dialog)</a></p>

<p class="spip">J’utilise donc un tuple de tuples (le tableau à 2 dimensions). La première donnée du tuple interne correspond à l’indice de l’élément de la ListBox. La seconde correspond à la valeur numérique associée.</p>

<p class="spip">Python est un langage qui interdit de mélanger les choux et les carottes. Il faut convertir les types incompatibles qu’on voudrait associer. Cela évite certains bugs liés à des conversions implicites mal maitrisées. C’est pourquoi j’utilise <strong class="spip">float()</strong> pour transformer le texte de <i class="spip">numberLineEdit</i> ainsi que <strong class="spip">` `</strong> pour transformer <i class="spip">decimals</i> en chaîne de caractère.</p>

<p class="spip">Pour le formatage du texte on utilise <strong class="spip">%</strong>. Celui-ci fonctionne avec une chaine de formatage et une liste de valeurs. Les habitués de la fonction sprintf() du C ne seront pas dépaysés. Pour les autres, vous pouvez consulter <a href="http://fr.php.net/manual/fr/function.sprintf.php" class="spip_out">l’aide en ligne de la fonction cprintf</a>. (oui c’est pour du PHP mais je ne connais pas encore un site équivalent pour Python)</p>

<p class="spip">Voici donc le fichier conversionform.ui.h</p>
<div style='text-align: left;' class='spip_code' dir='ltr'><code>void ConversionForm::convert()<br />
{<br />
        fromComboBoxList = ((0, 1000000.0), (1,1000.0), (2,10.0), (3, 1.0))<br />
        toComboBoxList = ((0, 63360.0), (1, 36.0), (2, 12.0), (3, 1.0))<br />
<br />
        # internally convert the input to millimeters<br />
        scaledInput = float(self.numberLineEdit.text().ascii()) * fromComboBoxList[self.fromComboBox.currentItem()][1]<br />
<br />
        #convert to inches<br />
        result = scaledInput * 0.0393701 / toComboBoxList[self.toComboBox.currentItem()][1]<br />
<br />
        # set the result<br />
        decimals = self.decimalsSpinBox.value()<br />
        self.resultLineEdit.setText(("%."+`decimals`+"f") % result)<br />
}</code></div>
<p class="spip">Il faut maintenant créer le fichier <i class="spip"> <strong class="spip">myconvert.py</strong> </i> qui va utiliser cette boite de dialogue</p>
<div style='text-align: left;' class='spip_code' dir='ltr'><code>from qt import *<br />
from conversionform import *<br />
import sys<br />
if __name__ == "__main__":<br />
    app = QApplication(sys.argv)<br />
    f = ConversionForm()<br />
    f.show()<br />
    app.setMainWidget(f)<br />
    app.exec_loop()<br />
</code></div>
<p class="spip">Puis lancer la compilation avec
<code class='spip_code' dir='ltr'>$ pyuic conversionform.ui > conversionform.py
</code></p>

<p class="spip">Et finalement
<code class='spip_code' dir='ltr'>$ python myconvert.py
</code></p>

<p class="spip">Pour obtenir :
<span class='spip_document_786 spip_documents spip_documents_center' >
<img src='http://download.tuxfamily.org/assocoagul/drupal-files/spip/pyqt2-MetricConversionFinal.jpg' width="253" height="229" alt="" /></span><p>

<p class="spip"><a href="http://www.coagul.org/article.php3?id_article=409" class="spip_out">Pour la suite, c’est ici</a></p>

<h2>Historique des modifications</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Version</strong></th><th scope='col'><strong class="spip">Date</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>0.1</td><td>26/02/2006</td><td>Création par Jibux</td></tr>
<tr class="row_odd"><td>0.2</td><td>26/11/2006</td><td>Ajout d’un lien vers l’article suivant</td></tr>
</tbody>
</table>
<dl class='spip_document_842 spip_documents spip_documents_left'  style='float:left;width:120px;'>
<dt><a href="http://download.tuxfamily.org/assocoagul/drupal-files/spip/Archive-6.zip" title='Zip - 4.2 ko' type="application/zip"><img src='dist/vignettes/zip.png' width='52' height='52' alt='Zip - 4.2 ko' /></a><dt>
<dt class='spip_doc_titre' style='width:120px;'><strong>Les fichiers sources de cette application</strong></dt>
</dl>