IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Interpolation de chaînes de caractères avec QString [QtCore]


Sujet :

PyQt Python

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut Interpolation de chaînes de caractères avec QString
    Bonjour à tous

    Aujourd'hui j'ai voulu mette à jour mes librairies PyQt. Je suis toujours sour Python 2.6 et Qt 4.8.5 donc je regarde ce qui est sorti récemment. J'étais sous PyQt 4.10.3 + sip 4.15.4 et je vois que PyQt 4.11.2 et sip 4.16.3 sont sortis. Toutefois n'arrivant pas à compiler PyQt 4.11.2 avec sip 4.16.3 je me rabats sur sip 4.16.2 qui va très bien.

    Et là, catatrosphe, mes applis ne fonctionnent plus. Elles m'indiquent une erreur chaque fois que j'affiche une QString au format "%s". Exemple print "%s" % QString("toto"). Il me répond TypeError: 'sip.methoddescriptor' object is not callable. Or ça fonctionnait bien entendu sans soucis auparavant.
    Bien entendu je fais quelques tests. Par exemple je remarque que print str(QString("toto")) fonctionne très bien.

    Donc bon c'est pas la mort, je peux adapter mon code mais comme il y en a toutefois pas mal (784 sources dans plusieurs projets) je venais d'abord ici voir si par hasard ce soucis serait arrivé à d'autres et si le fait qu'on ne puisse plus afficher un QString() directement était voulu ou bien si c'était un accident (auquel cas je redescends jusqu'à une version qui accepte ma syntaxe et j'attends que le correctif sorte).

    Merci de vos avis
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Uniquement dans des cas comme print QString('...') et pas dans des cas comme myQLabel.setText(QString('...')) ?

    En parcourant la toile avec ta description, on ne trouve pas de bug PyQt mais plutôt Python, toutefois cela concerne des versions antérieures à 2.7

    Cela dit, c'est peut-être l'occasion de pourchasser et supprimer les QString de tous tes codes. Ce qui peut se faire au moyen d'un script.

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Avec Python 2.7 et PyQt4, je travaille toujours en unicode, et j'essaie de ne pas mélanger les types Python et les types PyQt4. Cela veux dire que, pour les chaînes de caractères, je convertis tout ce qui vient de PyQt4 en unicode avant de l'utiliser, et que je n'envoie que de l'unicode à PyQt4.

    Par exemple avec un QLineEdit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    self.linedit.setText(unicode("toto"))
     
    ligne = unicode(self.linedit.text())
    C'est pareil pour les autres types PyQt4. Par exemple, si qsl est une variable de type QStringList, je la convertis avec: L = [unicode(elem) for elem in list(qsl)] avant de l'utiliser.

    Je suis en train de passer tous mes programmes en Python 3.4 (afin de rendre moins douloureux le passage à PyQt5 qui n'existe pas en 2.7), et je constate dans la conversion que les QString qui me restent doivent être effacés à la main, mais que les "unicode(...)" deviennent des "str(...)" souvent inutiles mais qui fonctionnent. Malgré la présence de 2to3.py, cette conversion Python 2.7 => 3.4 est une opération longue et pénible (mais nécessaire) que je mettrai probablement 2 ans à terminer. En contrepartie, la communication entre Python 3 et PyQt4 s'est fortement simplifiée.

    Je crois que lorsque les prochaines versions de Linux et MacOSX auront un Python 3 par défaut, cela va accélérer l'abandon de Python 2.7.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Uniquement dans des cas comme print QString('...') et pas dans des cas comme myQLabel.setText(QString('...')) ?
    Non non, hier quand je me penchais sur le problème j'ai remplacé Q...("%s" % QString(...)) par Q...("%1").arg(QString(...)) et ça a fonctionné

    Citation Envoyé par VinsS Voir le message
    En parcourant la toile avec ta description, on ne trouve pas de bug PyQt mais plutôt Python, toutefois cela concerne des versions antérieures à 2.7
    Oui, hier soir moi aussi j'ai vu ça en effet. Et effectivement je suis sur une vieille Debian Squeeze avec Python 2.6.6 par défaut (pardon quand j'ai écrit mon post j'étais persuadé d'être sous 2.7 mais c'est parce que je porte ensuite mes applis sous Windows et que là je suis bien en 2.7). Et en effet, cette nuit j'ai installé Python 2.7.8 puis j'ai tout recompilé (même sip 4.16.3 qui m'avait posé des soucis et avec, petite cerise, Qt 4.8.6 puisque j'y étais). Et ce matin (en fait c'est une unité de compilation automatique que j'ai écrite donc ça a bossé pendant que je dormais) tout refonctionne niquel. Le "%s" % QString("toto") passe très bien.

    Citation Envoyé par VinsS Voir le message
    Cela dit, c'est peut-être l'occasion de pourchasser et supprimer les QString de tous tes codes. Ce qui peut se faire au moyen d'un script.
    Ben par quoi je remplacerais alors mes QString ? Moi j'aurais plutôt dit que c'est l'occasion de remplacer tous les "%s" % QString("toto") par des .arg(String("toto")) qui reste la bonne façon d'afficher une variable. Parce que pour le fofo j'ai simplifié le problème au maximum mais mon code c'est plutôt
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    result=QApplication.translate(tout un code qui récupère une valeur ou une autre en fonction des droits, de la licence, etc et qui le met en forme avec des balises html et qui pourra même etre traduite dans une autre langue (cahier des charges oblige))
    QMessageBox(QApplication.translate("Votre résultat est %s" % result))
    Alors que ça devrait être
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    QMessageBox(QApplication.translate("Votre résultat est %1")).arg(result)
    Je sais, je fais pas toujours bien les choses mais parfois je cède à la simplicité (surtout que la lib Qt a été écrite tout d'abord pour le C++ qui n'a pas les facilités de Python)

    Citation Envoyé par tyrtamos Voir le message
    Avec Python 2.7 et PyQt4, je travaille toujours en unicode, et j'essaie de ne pas mélanger les types Python et les types PyQt4. Cela veux dire que, pour les chaînes de caractères, je convertis tout ce qui vient de PyQt4 en unicode avant de l'utiliser, et que je n'envoie que de l'unicode à PyQt4.

    Par exemple avec un QLineEdit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    self.linedit.setText(unicode("toto"))
     
    ligne = unicode(self.linedit.text())
    Oui, j'avais vu ton post sur le type qui avait des problèmes d'unicode où tu expliquais déjà cela et j'avais beaucoup aimé. C'est en effet une très bonne façon de faire et j'avais même tenté de faire un petit essai sur un tout petit module de mon appli. Et l'essai à fonctionné (le module m'affichait très bien les trucs de ma bdd et enregistrait très bien les valeurs que je lui passais). Mais j'ai peur de la tâche à accomplir si je dois tout passer comme ça. Donc pour l'instant j'ai gardé tout ce que tu as dit dans un coin de ma tête dans la liste des choses à peut-être faire
    Car malheureusement j'ai appris Python tout seul et donc j'ai pas forcément bien fait les choses dès le départ (bien que j'ai évolué et souvent quand je trouvais un truc je reparcourais tous mes sources pour l'appliquer) et donc je dois aussi rester compatible avec ce qui fonctionne...

    Citation Envoyé par tyrtamos Voir le message
    Je suis en train de passer tous mes programmes en Python 3.4 (afin de rendre moins douloureux le passage à PyQt5 qui n'existe pas en 2.7), et je constate dans la conversion que les QString qui me restent doivent être effacés à la main, mais que les "unicode(...)" deviennent des "str(...)" souvent inutiles mais qui fonctionnent. Malgré la présence de 2to3.py, cette conversion Python 2.7 => 3.4 est une opération longue et pénible (mais nécessaire) que je mettrai probablement 2 ans à terminer. En contrepartie, la communication entre Python 3 et PyQt4 s'est fortement simplifiée.
    Ben moi aussi le passage Python2 => Python3 m'obsède aussi car je me dis qu'un jour ou l'autre il faudra bien y passer...

    Citation Envoyé par tyrtamos Voir le message
    Je crois que lorsque les prochaines versions de Linux et MacOSX auront un Python 3 par défaut, cela va accélérer l'abandon de Python 2.7.
    Déjà Debian Squeeze a Python 3 d'installé (suffit d'appeler python3 à la place de python).

    En tout cas, ce matin le problème est résolu. Ce n'était pas la faute de PyQt ou de sip mais de Python. Merci de vos conseils
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FAQ] Comment tester une chaîne de caractères avec une expression régulière ?
    Par Baptiste Wicht dans le forum Vos Contributions VBScript
    Réponses: 1
    Dernier message: 20/11/2007, 19h43
  2. Extraction d'une chaîne de caractère avec SQL
    Par opeo dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 28/07/2006, 15h36
  3. Réponses: 3
    Dernier message: 16/03/2006, 16h44
  4. chaîne de caractère avec '#'
    Par nicoaix dans le forum Langage
    Réponses: 3
    Dernier message: 09/03/2006, 15h10
  5. [RegEx] chaîne de caractères avec caractères spéciaux
    Par Kerod dans le forum Langage
    Réponses: 9
    Dernier message: 25/12/2005, 01h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo