Python et QT (tutoriel 2)
Dans le tutoriel précédent, 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.
Éléments abordés dans ce document
Les tuples « avec () »
Le transtypage « avec float() et `` »
Le formatage des chaînes de caractères « avec %»
Au travail
Maintenant que vous connaissez QT designer vous devriez pouvoir créer ceci Pour plus de détails vous pouvez consulter ce site 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 ;-). 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. 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 float() pour transformer le texte de numberLineEdit ainsi que ` ` pour transformer decimals en chaîne de caractère. Pour le formatage du texte on utilise %. 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 l’aide en ligne de la fonction cprintf. (oui c’est pour du PHP mais je ne connais pas encore un site équivalent pour Python) Voici donc le fichier conversionform.ui.h


Détail de l’implémentation
L’idée consiste à remplacer les switchs proposés dans le code C++ par cette structure de données. (voir Coding the Dialog)void ConversionForm::convert()
{
fromComboBoxList = ((0, 1000000.0), (1,1000.0), (2,10.0), (3, 1.0))
toComboBoxList = ((0, 63360.0), (1, 36.0), (2, 12.0), (3, 1.0))
# internally convert the input to millimeters
scaledInput = float(self.numberLineEdit.text().ascii()) * fromComboBoxList[self.fromComboBox.currentItem()][1]
#convert to inches
result = scaledInput * 0.0393701 / toComboBoxList[self.toComboBox.currentItem()][1]
# set the result
decimals = self.decimalsSpinBox.value()
self.resultLineEdit.setText(("%."+`decimals`+"f") % result)
}
Il faut maintenant créer le fichier myconvert.py qui va utiliser cette boite de dialogue
from qt import *
from conversionform import *
import sys
if __name__ == "__main__":
app = QApplication(sys.argv)
f = ConversionForm()
f.show()
app.setMainWidget(f)
app.exec_loop()
Puis lancer la compilation avec
$ pyuic conversionform.ui > conversionform.py
Et finalement
$ python myconvert.py
Pour obtenir :

Historique des modifications
| Version | Date | Commentaire |
|---|---|---|
| 0.1 | 26/02/2006 | Création par Jibux |
| 0.2 | 26/11/2006 | Ajout d’un lien vers l’article suivant |
| Fichier attaché | Taille |
|---|---|
| pyqt2-MetricConversion.jpg | 35 Ko |
| pyqt2-Connections.jpg | 49.22 Ko |
| pyqt2-MetricConversionFinal.jpg | 14.5 Ko |
| Les fichiers sources de cette application | 4.22 Ko |


Commentaires
> Python et QT (tutoriel 2)
Je suis effectivement beaucoup plus d’accord avec le terme de "typage dynamique".
Bye :o)
> Python et QT (tutoriel 2)
En fait je reprenais cette info d’une documentation qui disait typage dynamique (là au moins il n’y a pas débat) et fortement typé car (en gros) impossible de changer le type après une première affectation et pas de mélange des genres sans conversion explicite. Mais ton lien sur Wikipédia montre à quel point cette notion peut prêter à troll.
J’ai donc modifié l’article en conséquence pour ne pas attirer les foudres des spécialistes.
En tout cas merci pour tes relectures et d’apprécier à sa juste valeur l’effort de formatage ;-). De plus, sache je ne trouve pas tes remarques pénibles car celles-ci sont toujours constructives.
> Python et QT (tutoriel 2)
Je souscris à la (quasi) totalité de ton article. Vraiment très intéressant.
De plus j’apprécie le fait que ton article soit intégralement en html/Spip et pas en PDF joint (merci pour l’effort de formatage).
En revanche, je ne suis pas vraiment d’accord avec le fait de dire que Python est un langage fortement typé. Même si le concept fortement/faiblement typé fait débat, je n’ai pas l’impression que Python corresponde à la série de définitions généralement admises pour qualifier un langage fortement typé. Je me réfère pour cela à la page ad’hoc de Wikipédia et en particulier aux points 4, 5 et 8 de ladite page.
NB : lire en particulier la fin de la page et la citation :o)
Bye
Désolé de jouer encore une fois à M. Pénible :o)