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 :

Qt5 remplacement du texte dans un widget


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2021
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2021
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Qt5 remplacement du texte dans un widget
    Bonjour tout le monde

    Voila j'ai créé un petit programme qui analyse un texte après l'avoir copier
    ça fonctionne a peu près mais 'il m'affiche directement le dernier message

    en faite je voudrai qu'il affiche déjà un premier message puis qu'il le remplace par le second

    exemple si "Nono" et "chien" sont présent dans le texte copié
    premier message "nom présent"
    pause
    seconde message " espèce présente"

    comment puis réaliser cela ?

    voila ce que j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    import pyperclip
    import time
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    # texte pour test " bonjour je suis Nono le petit chien "
     
     
    class Ui_WizardPage(object):
     
        def pause(self):
            time_duration = 3.5
            time.sleep(time_duration)
     
        def trace(self):
            b = pyperclip.paste()
            b = str(b)
            b = b.replace("b'", "")
            texte = b.replace("'", "")
     
            if "Nono" in str(texte):
                self.textBrowser.setText(" nom présent ")
                self.textBrowser.setStyleSheet("color: rgb(0, 255, 0);")
                self.pause()
                if "chien " in str(texte):
                    self.textBrowser.setText(" espèce présent ")
                    self.textBrowser.setStyleSheet("color: rgb(0, 255, 0);")
                else:
                    self.textBrowser.setText(" espèce absente ")
                    self.textBrowser.setStyleSheet("color: rgb(255, 0, 0);")
     
            else:
                self.textBrowser.setText("! nom absent !")
                self.textBrowser.setStyleSheet("color: rgb(255, 0, 0);")
                self.pause()
     
     
     
     
     
        def setupUi(self, WizardPage):
            WizardPage.setObjectName("WizardPage")
            WizardPage.setEnabled(True)
            WizardPage.setMinimumSize(QtCore.QSize(300, 300))
            WizardPage.setMaximumSize(QtCore.QSize(300, 300))
            font = QtGui.QFont()
            font.setPointSize(12)
            WizardPage.setFont(font)
     
            self.pushButton = QtWidgets.QPushButton(WizardPage)
            self.pushButton.setGeometry(QtCore.QRect(30, 130, 241, 51))
            self.pushButton.setObjectName("pushButton")
            self.pushButton.clicked.connect(self.trace)
     
            self.textBrowser = QtWidgets.QTextBrowser(WizardPage)
            self.textBrowser.setGeometry(QtCore.QRect(30, 200, 241, 41))
            self.textBrowser.setObjectName("textBrowser")
     
            self.label = QtWidgets.QLabel(WizardPage)
            self.label.setGeometry(QtCore.QRect(10, 40, 271, 61))
            self.label.setAlignment(QtCore.Qt.AlignCenter)
            self.label.setObjectName("label")
     
            self.retranslateUi(WizardPage)
            QtCore.QMetaObject.connectSlotsByName(WizardPage)
     
        def retranslateUi(self, WizardPage):
            _translate = QtCore.QCoreApplication.translate
            WizardPage.setWindowTitle(_translate("WizardPage", "WizardPage"))
            self.pushButton.setText(_translate("WizardPage", "tester"))
            self.label.setText(_translate("WizardPage", "<html><head/><body><p align=\"center\">copier votre texte puis</p><p align=\"center\">cliquer sur tester</p></body></html>"))
     
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        WizardPage = QtWidgets.QWizardPage()
        ui = Ui_WizardPage()
        ui.setupUi(WizardPage)
        WizardPage.show()
        sys.exit(app.exec_())
    merci d'avance

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 076
    Points : 4 392
    Points
    4 392
    Par défaut
    bonjour

    on n'utilise jamais de sleep() ! Mais plutôt un timeur (QTimer)
    par exemple

    1) On stocke les réponses dans une variable "liste"
    Ui_WizardPage.reponse = ("le chien", "toto", "est vivant")

    2) On lance le timeur

    3) A chaque déclenchement, on récupère le 1er item, on l'affiche et le supprime de la liste "self.reponse". Arrêt du timeur lorsque la liste est vide.
    $moi= ( !== ) ? : ;

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2021
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2021
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    merci pour ta réponse

    je t'avoue que je ne comprends pas trop comment fonctionne le timer

    je commence par récupérer comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
        def trace(self):
            b = pyperclip.paste()
            b = str(b)
            b = b.replace("b'", "")
            texte = b.replace("'", "")
            Ui_WizardPage.reponse = []
            if "Nono" in str(texte):
                if "chien" in str(texte):
                    Ui_WizardPage.reponse.append("nom présent")
                    Ui_WizardPage.reponse.append("espère présente")
                else:
                    Ui_WizardPage.reponse.append("nom présent")
                    Ui_WizardPage.reponse.append("espère absente")
     
            else:
                Ui_WizardPage.reponse.append("nom absent")
     
            print(Ui_WizardPage.reponse)
    mais ensuite comment faire pour intégrer la fonction timer, je dois créer une nouvelle fonction ?

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 076
    Points : 4 392
    Points
    4 392
    Par défaut
    Citation Envoyé par rg71800 Voir le message
    je ne comprends pas trop comment fonctionne le timer
    En fait, tu n'as pas suivi le moindre tuto Qt ? Qtimer va déclencher un événement comme tu utilises déjà à foison dans Qt, il n'y a pas de différence et rien de plus.
    self.pushButton.clicked.connect(self.trace) bien sûr si c'est du code que tu as copié sans comprendre les mécanismes de Qt, tu ne risques pas d'avancer.

    Pour le lancer, il suffit de faire une recherche web ou de simplement lire la doc Qt. Coder en Qt sans lire la doc ... je ne comprends comment cela est possible ; en tout cas, pas possible pour moi, car je ne suis pas un extralucide.
    $moi= ( !== ) ? : ;

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2021
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2021
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    bonjour

    voila je ne suis remis la tête en place cette nuit et je suis arrivé a résoudre mon problème ce matin
    merci papajoker pour ton aiguillage

    voila mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    from PyQt5 import QtWidgets
    from PyQt5.QtWidgets import QApplication, QMainWindow
    from PyQt5 import QtCore
    import sys
     
    import pyperclip
    import time
    from PyQt5 import QtCore, QtGui, QtWidgets
     
     
    # texte pour test " bonjour je suis Nono le petit chien "
     
    class Ui_WizardPage(object):
     
        def printer(self):
            self.textBrowser.setText(self.reponse[0])
            del self.reponse[0]
            if len(self.reponse)==0:
                print("fini")
                self.timer.stop()
     
        def timer(self):
            self.timer = QtCore.QTimer()
            self.timer.timeout.connect(self.printer)
            self.timer.start(5000)
     
        def trace(self):
            b = pyperclip.paste()
            b = str(b)
            b = b.replace("b'", "")
            texte = b.replace("'", "")
            Ui_WizardPage.reponse = []
            if "Nono" in str(texte):
                if "chien" in str(texte):
                    Ui_WizardPage.reponse.append("nom présent")
                    Ui_WizardPage.reponse.append("espère présente")
                else:
                    Ui_WizardPage.reponse.append("nom présent")
                    Ui_WizardPage.reponse.append("espère absente")
     
            else:
                Ui_WizardPage.reponse.append("nom absent")
     
     
        def setupUi(self, WizardPage):
            WizardPage.setObjectName("WizardPage")
            WizardPage.setEnabled(True)
            WizardPage.setMinimumSize(QtCore.QSize(300, 300))
            WizardPage.setMaximumSize(QtCore.QSize(300, 300))
            font = QtGui.QFont()
            font.setPointSize(12)
            WizardPage.setFont(font)
     
            self.pushButton = QtWidgets.QPushButton(WizardPage)
            self.pushButton.setGeometry(QtCore.QRect(30, 130, 241, 51))
            self.pushButton.setObjectName("pushButton")
            self.pushButton.clicked.connect(self.trace)
            self.pushButton.clicked.connect(self.timer)
     
            self.textBrowser = QtWidgets.QTextBrowser(WizardPage)
            self.textBrowser.setGeometry(QtCore.QRect(30, 200, 241, 41))
            self.textBrowser.setObjectName("textBrowser")
     
            self.label = QtWidgets.QLabel(WizardPage)
            self.label.setGeometry(QtCore.QRect(10, 40, 271, 61))
            self.label.setAlignment(QtCore.Qt.AlignCenter)
            self.label.setObjectName("label")
     
            self.retranslateUi(WizardPage)
            QtCore.QMetaObject.connectSlotsByName(WizardPage)
     
        def retranslateUi(self, WizardPage):
            _translate = QtCore.QCoreApplication.translate
            WizardPage.setWindowTitle(_translate("WizardPage", "WizardPage"))
            self.pushButton.setText(_translate("WizardPage", "tester"))
            self.label.setText(_translate("WizardPage",
                                          "<html><head/><body><p align=\"center\">copier votre texte puis</p><p align=\"center\">cliquer sur tester</p></body></html>"))
     
     
    if __name__ == "__main__":
        import sys
     
        app = QtWidgets.QApplication(sys.argv)
        WizardPage = QtWidgets.QWizardPage()
        ui = Ui_WizardPage()
        ui.setupUi(WizardPage)
        WizardPage.show()
        sys.exit(app.exec_())

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 076
    Points : 4 392
    Points
    4 392
    Par défaut
    Désolé d'avoir été un peu "méchant", mais on retient 100 fois mieux si on apprend par sois même qu'avec un simple copier coller. Et le but d'un codeur, c'est d'être autonome, donc autant commencer le plus tôt possible Si tu trouves par toi-même avec juste des directions données, alors c'est gagné.

    remarques:
    - pas top d'appeler ta fonction self.timer() comme self.timer ta variable.
    - self.pushButton.clicked.connect(self.timer) plutôt appeler directement ta fonction à la fin de ta fonction trace(), par un simple self.timer().
    - if len(self.reponse)==0: pas python ce code, écrire uniquement : if self.reponse:.

    Bon courage pour la suite.
    $moi= ( !== ) ? : ;

  7. #7
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2021
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2021
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Re bonjour papajoker je reviens après quelques jour d'absence
    j'ai modifié mon petit bout de code en tenant compte de tes remarques mais en remplaçant if len(self.reponse)==0: par if self.reponse:
    le premier message s'affiche correctement mais ensuite il saute directement au print("fini") pourquoi ?

    et autre question toujours sur le même sujet
    je suis en train de faire un petit code qui télécharge des fichiers sur un site internet et je voudrais qu'il m'affiche dans un label le nom du fichier qu'il charge puis il passe au suivant.
    mais dans ce cas je ne peux pas utiliser la méthode précédente a partir d'une liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
        def charge_deg(self):
            self.dossier = str(self.lineEdit_adresse.text())
            if os.path.exists(self.dossier + "/dalle_deg") == False:
                os.makedirs(self.dossier + "/dalle_deg")
            for self.y in reversed(self.lat):
                for self.x in self.lon:
                    if os.path.exists(self.dossier + "/dalle_deg" + "/1_" + str(self.x) + "_" + str(self.y) + ".deg") == False:
                        url = 'https://static.virtualregatta.com/ressources/maps/dalles/vro2k16/1/' + str(
                            int(self.x / 10)) + "/" + str(
                            int(self.y / 10)) + "/1_" + str(self.x) + "_" + str(self.y) + ".deg"
                        self.fileName = "/1_" + str(self.x) + "_" + str(self.y)
                        print(url)
                        try:
                            urllib.request.urlopen(url)
                        except urllib.error.HTTPError as e:
                            self.a = (self.x, "_", self.y, "-HTTP error")
     
                        except urllib.error.URLError as e:
                            self.a = (self.x, "_", self.y, "-URL error")
     
                        else:
                            urllib.request.urlretrieve(url, self.dossier + "/dalle_deg" + "/" + self.fileName + ".deg")
                            self.a = (self.x , "_" , self.y + "ok")
    voila ma fonction qui charge les fichiers
    si je pouvais avoir une petite aide j'espère ne pas me reprendre un méchant coup de pied au derrière lol

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par rg71800 Voir le message
    j'ai modifié mon petit bout de code en tenant compte de tes remarques mais en remplaçant if len(self.reponse)==0: par if self.reponse:
    le premier message s'affiche correctement mais ensuite il saute directement au print("fini") pourquoi ?
    Peut-être parce que le test if len(self.reponse) == 0 n'est pas du tout équivalent au test if self.reponse

    Citation Envoyé par rg71800 Voir le message
    je suis en train de faire un petit code qui télécharge des fichiers sur un site internet et je voudrais qu'il m'affiche dans un label le nom du fichier qu'il charge puis il passe au suivant.
    Ben te suffit de créer le label comme attribut de ton objet de chargement. Comme ça tout l'objet le connait et quand il charge le fichier il a possibilité de modifier le label en conséquence.

    Citation Envoyé par rg71800 Voir le message
    if os.path.exists(self.dossier + "/dalle_deg") == False
    On ne teste jamais "truc égal False" (ou "truc égal True"). On teste directement truc. Parce qu'un truc peut-être vrai (ou faux) sans être égal spécifiquement à la valeur True (ou False)
    Et tu as os.path.join() pour créer des chemins (ou pathlib plus puissant).
    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]

  9. #9
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2021
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2021
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    merci Sve@r pour ta réponse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'test.ui'
    #
    # Created by: PyQt5 UI code generator 5.15.4
    #
    # WARNING: Any manual changes made to this file will be lost when pyuic5 is
    # run again.  Do not edit this file unless you know what you are doing.
     
     
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5 import QtCore, QtGui, QtWidgets
    import zlib
    import urllib.request
    import os
    import numpy as np
    import glob
    from PIL import Image
    from itertools import islice
    import shutil
     
    class Ui_Form(object):
     
        def effaceur(self):
     
            if os.path.exists("K:/generateur CHT/Nouveau dossier"):
                shutil.rmtree("K:/generateur CHT/Nouveau dossier")
                self.zone_course()
            else:
                self.zone_course()
     
        def zone_course(self):
     
            self.lat = range(49, (51 + 1))
            self.lon = range(-7, (-4 + 1))
            self.charge_deg()
     
        def charge_deg(self):
     
            if os.path.exists("K:/generateur CHT/Nouveau dossier/dalle_deg") == False:
                os.makedirs("K:/generateur CHT/Nouveau dossier/dalle_deg")
            for self.y in reversed(self.lat):
                for self.x in self.lon:
                    if os.path.exists("K:/generateur CHT/Nouveau dossier/dalle_deg" + "/1_" + str(self.x) + "_" + str(self.y) + ".deg") == False:
                        url = 'https://static.virtualregatta.com/ressources/maps/dalles/vro2k16/1/' + str(
                            int(self.x / 10)) + "/" + str(
                            int(self.y / 10)) + "/1_" + str(self.x) + "_" + str(self.y) + ".deg"
                        self.fileName = "/1_" + str(self.x) + "_" + str(self.y)
                        print(url)
                        try:
                            urllib.request.urlopen(url)
                        except urllib.error.HTTPError as e:
                            self.a = (self.x, "_", self.y, "-HTTP error")
                            print(self.a)
                        except urllib.error.URLError as e:
                            self.a = (self.x, "_", self.y, "-URL error")
                            print(self.a)
                        else:
                            urllib.request.urlretrieve(url, "K:/generateur CHT/Nouveau dossier/dalle_deg" + "/" + self.fileName + ".deg")
                            self.a = str((self.x , "_" , self.y, "ok"))
                            print(self.a)
                            self.label.setText(self.a)
                            self.label.setStyleSheet(
                                "background-color: white; border: 1px solid black;color: black;")
            b = "terminé"
            self.label.setText(b)
            self.label.setStyleSheet("background-color: white; border: 1px solid black;color: black;")
     
     
     
        def setupUi(self, Form):
            Form.setObjectName("Form")
            Form.resize(598, 430)
            self.pushButton = QtWidgets.QPushButton(Form)
            self.pushButton.setGeometry(QtCore.QRect(230, 290, 111, 61))
            self.pushButton.setObjectName("pushButton")
            self.pushButton.clicked.connect(self.effaceur)
     
            self.label = QtWidgets.QLabel(Form)
            self.label.setGeometry(QtCore.QRect(130, 160, 331, 41))
            self.label.setText("")
            self.label.setAlignment(QtCore.Qt.AlignCenter)
            self.label.setStyleSheet("background-color: white; border: 1px solid black;")
            self.label.setAlignment(QtCore.Qt.AlignCenter)
            self.label.setObjectName("label")
     
            self.retranslateUi(Form)
            QtCore.QMetaObject.connectSlotsByName(Form)
     
        def retranslateUi(self, Form):
            _translate = QtCore.QCoreApplication.translate
            Form.setWindowTitle(_translate("Form", "Form"))
            self.pushButton.setText(_translate("Form", "charger"))
     
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        Form = QtWidgets.QWidget()
        ui = Ui_Form()
        ui.setupUi(Form)
        Form.show()
        sys.exit(app.exec_())
    voila mon bout de code un peu plus complet et je crois qu'une fois de plus je suis en train de me perdre j'ai créé un label mais je ne comprend pas comment le déclarer comme attribut de mon objet charge_deg
    si je pouvais avoir quelques petites explications supplémentaire se serait sympa
    pour tes autres remarques je vais me pencher dessus
    encore merci

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rg71800 Voir le message
    j'ai créé un label mais je ne comprend pas comment le déclarer comme attribut de mon objet charge_deb
    charge_deg ce n'est pas un objet, c'est une méthode. L'objet c'est "Ui_Form" et à ce que je vois, le label est déjà attribut (pour créer un attribut "truc" dans un objet il suffit d'écrire self.truc=... à un endroit où on est certain que ce sera exécuté donc généralement on le met dans le __init__ de l'objet). Tu as écrit self.label=QLabel() donc ton label est accessible de partout dans l'objet. Donc dès que tu veux modifier son texte il te suffit d'écrire self.label.setText(...).
    En revanche je ne pige pas pourquoi, dans charge_deb, les variables "a", "x" et "y" sont attributs. Un attribut c'est un élément qui a nécessité d'être accessible dans tout l'objet (et parfois même au dehors de l'objet aussi même si généralement on n'aime pas trop ça). Si une fonction (une méthode) a besoin de variables pour faire son travail, elle les crée, bêtement, sans pour ça les mettre obligatoirement comme attribut.

    Citation Envoyé par rg71800 Voir le message
    si je pouvais avoir quelques petites explications supplémentaire se serait sympa
    https://python.developpez.com/telech.../47/Hello-Word
    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]

  11. #11
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2021
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2021
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    je me rends compte que j'ai des lacunes au niveau du vocabulaire

    en effet a, x et y sont de simples variables donc le self est en trop

    du coup j'ai repris mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    from PyQt5 import QtCore, QtGui, QtWidgets
    import urllib.request
    import os
    import shutil
     
    class Ui_Form(object):
     
     
        def effaceur(self):
     
            if os.path.exists("K:/generateur CHT/Nouveau dossier"):
                shutil.rmtree("K:/generateur CHT/Nouveau dossier")
                self.zone_course()
            else:
                self.zone_course()
     
        def zone_course(self):
     
            self.lat = range(49, (51 + 1))
            self.lon = range(-7, (-4 + 1))
            self.charge_deg()
     
        def charge_deg(self):
     
            if os.path.exists("K:/generateur CHT/Nouveau dossier/dalle_deg") == False:
                os.makedirs("K:/generateur CHT/Nouveau dossier/dalle_deg")
            for y in reversed(self.lat):
                for x in self.lon:
                    if os.path.exists("K:/generateur CHT/Nouveau dossier/dalle_deg" + "/1_" + str(x) + "_" + str(y) + ".deg") == False:
                        url = 'https://static.virtualregatta.com/ressources/maps/dalles/vro2k16/1/' + str(
                            int(x / 10)) + "/" + str(
                            int(y / 10)) + "/1_" + str(x) + "_" + str(y) + ".deg"
                        self.fileName = "/1_" + str(x) + "_" + str(y)
                        print(url)
                        try:
                            urllib.request.urlopen(url)
                        except urllib.error.HTTPError as e:
                            a = (x, "_", y, "-HTTP error")
                            print(a)
                        except urllib.error.URLError as e:
                            a = (x, "_", y, "-URL error")
                            print(a)
                        else:
                            urllib.request.urlretrieve(url, "K:/generateur CHT/Nouveau dossier/dalle_deg" + "/" + self.fileName + ".deg")
                            a = str((x , "_" , y, "ok"))
                            print(a)
                            self.label.setText(a)
     
     
     
        def setupUi(self, Form):
            Form.setObjectName("Form")
            Form.resize(598, 430)
            self.pushButton = QtWidgets.QPushButton(Form)
            self.pushButton.setGeometry(QtCore.QRect(230, 290, 111, 61))
            self.pushButton.setObjectName("pushButton")
            self.pushButton.clicked.connect(self.effaceur)
     
            self.label = QtWidgets.QLabel(Form)
            self.label.setGeometry(QtCore.QRect(130, 160, 331, 41))
            self.label.setText("debut")
            self.label.setAlignment(QtCore.Qt.AlignCenter)
            self.label.setStyleSheet("background-color: white; border: 1px solid black;")
            self.label.setAlignment(QtCore.Qt.AlignCenter)
            self.label.setObjectName("label")
     
            self.retranslateUi(Form)
            QtCore.QMetaObject.connectSlotsByName(Form)
     
        def retranslateUi(self, Form):
            _translate = QtCore.QCoreApplication.translate
            Form.setWindowTitle(_translate("Form", "Form"))
            self.pushButton.setText(_translate("Form", "charger"))
     
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        Form = QtWidgets.QWidget()
        ui = Ui_Form()
        ui.setupUi(Form)
        Form.show()
        sys.exit(app.exec_())
    j'ai donc ajouté self.label.setText(a) dans la boucle de ma méthode charge_deg mais il m'affiche le message a uniquement au dernier passage il y a un truc qui m'échappe

    et autre question qui n'a rien a voir, comment faites vous pour mettre des parties de vos réponses sur fond gris ?

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rg71800 Voir le message
    du coup j'ai repris mon code
    Reprends-le encore parce que voir écrit...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if truc:
    	action
    else:
    	action
    ... ça me hérisse.

    Citation Envoyé par rg71800 Voir le message
    je me rends compte que j'ai des lacunes au niveau du vocabulaire
    Ok, alors rapide
    • une classe c'est un objet, c'est à dire une représentation informatique d'un objet de la vie réelle
    • une instance de classe c'est une variable du type de cette classe
    • tout comme dans la vie réelle, un objet peut avoir des caractéristiques (taille, poids, couleur) qui sont stockées dans des variables appelées "attributs". Certains attributs sont associés aux instances (deux cercles n'auront pas le même rayon) et d'autres sont associés à la classe elle-même (toutes les instances auront la même valeur pour ces attributs). Ce sont des attributs "statiques". Par exemple "lat" et "lon" qui semblent être toujours les mêmes auraient avantages à passer attributs statiques
    • tout comme dans la vie réelle, un objet peut avoir des actions (allumer(), avancer(), tourner()) qui sont stockées dans des fonctions appelées "méthodes". Pareil que pour les attributs, on peut avoir des méthodes d'instances (le plus habituel) et/ou des méthodes de classe (méthodes qui s'appliquent de la même façon quelle que soit l'instance qui l'invoque)


    Citation Envoyé par rg71800 Voir le message
    il y a un truc qui m'échappe
    Oui, mais à moi aussi. Parce que j'ai réécrit ta fonction "charge_deg" au plus simple...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def charge_deg(self):
    	for x in self.lon:
    		a = str((x , "_" , "ok"))
    		print(a)
    		self.label.setText(a)
    		time.sleep(1)
    	# for
    # charge_deg()
    ... et ça ne change rien, le label n'est pas mis à jour avant la fin de la boucle.

    Ce que je pense, c'est que la boucle prend la main sur le process et Qt est en quelque sorte "gelé". tyrtamos (un autre intervenant qui excelle en PyQt pourrait probablement donner un avis plus détaillé à ce sujet mais ça fait un moment qu'on ne l'a pas vu).
    Et justement ça m'a rappelé un problème analogue => https://www.developpez.net/forums/d2...bar-threading/

    A partir de l'exemple que j'ai écrit dans cet autre fil, j'ai bricolé ce petit truc qui, lui, fonctionne
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    #!/usr/bin/env python3
    # coding: utf-8
     
    import sys
    import time
    from PyQt5.QtCore import *
    from PyQt5.QtWidgets import *
     
    class cWork(QThread):
    	sigInfo=pyqtSignal(int)				# Signal information travail
    	sigTerminated=pyqtSignal(bool)			# Signal travail terminé
     
    	def __init__(self, bornes, *args, **kwargs):
    		super().__init__(*args, **kwargs)
    		self.__bornes=bornes
    	# ___init__()
     
    	def run(self):
    		for i in range(*self.__bornes):
    			self.sigInfo[int].emit(i)
    			time.sleep(0.05)
    		# for
     
    		self.sigTerminated[bool].emit(True)
    	# run()
     
    	# Arrêt du thread (méthode surchargée)
    	def terminate(self, *, force=False):
    		super().terminate()
    		if force: self.sigTerminated[bool].emit(False)
    	# terminate()
    # class cWork()
     
    class myWidget(QWidget):
    	def __init__(self, bornes=(0, 100), *args, **kwargs):
    		super().__init__(*args, **kwargs)
     
    		# Les bornes du travail
    		self.__bornes=bornes
     
    		# Création thread
    		self.__travail=cWork(self.__bornes)
    		self.__travail.sigInfo[int].connect(self.__slotLabel)
    		self.__travail.sigTerminated[bool].connect(self.__slotTerminated)
     
    		# Boutons départ et arrêt
    		self.__startBtn=QPushButton("Départ", parent=self, clicked=self.__slotStart)
    		self.__stopBtn=QPushButton("Arrêt", parent=self, clicked=self.__slotStop)
     
    		# Le label
    		self.__label=QLabel(parent=self)
    		self.__label.setAlignment(Qt.AlignHCenter)
     
    		# Layout de positionnement
    		mainLayout=QVBoxLayout(self)
    		mainLayout.addWidget(self.__startBtn, stretch=0)
    		mainLayout.addWidget(self.__stopBtn, stretch=0)
    		mainLayout.addStretch(1)
    		mainLayout.addWidget(self.__label, stretch=0)
     
    		# Affichage fenêtre
    		self.show()
    	# __init__()
     
            @pyqtSlot(bool)
    	def __slotStart(self, flag):
    		# Si le thread est déjà en route, il ne redémarre pas
    		if self.__travail.isRunning(): return
     
    		# Lance le thread (mais ne l'attend pas avec .join!!!)
    		self.__travail.start()
    	# __slotStart()
     
    	# Arrête le thread
            @pyqtSlot(bool)
    	def __slotStop(self, flag):
    		# Si le thread est déjà arrêté, il ne s'arrête pas deux fois
    		if not self.__travail.isRunning(): return
     
    		# Thread arrêté de force
    		self.__travail.terminate(force=True)
    	# __slotStop()
     
    	# Met à jour le label
            @pyqtSlot(int)
    	def __slotLabel(self, i):
    		self.__label.setText("%d/%d" % (i+1, self.__bornes[1]))
    	# __slotLabel()
     
    	# Lorsque le travail se termine
            @pyqtSlot(bool)
    	def __slotTerminated(self, terminated):
    		QMessageBox.information(
    			self,
    			"Opération longue",
    			"Fin normale" if terminated else "Arrêt demandé avant la fin!",
    		)
    	# __slotTerminated()
     
    	# Evènement fermeture fenêtre
    	def closeEvent(self, event):
    		# Si le thread est actif
    		if self.__travail.isRunning():
    			# Arrêt thread
    			self.__travail.terminate(force=True)
     
    			# Désactive les liens (pas certain que ce soit vraiment nécessaire mais...)
    			self.__travail.sigInfo[int].disconnect()
    			self.__travail.sigTerminated[bool].disconnect()
    		# if
     
    		super().closeEvent(event)
    	# closeEvent()
    # class myWidget
     
    if __name__ == "__main__":
    	app=QApplication(sys.argv)
    	fen=myWidget((0, 100))
    	sys.exit(app.exec_())
    # if
    L'idée est la suivante: le travail effectif est fait par un thread qui émet à intervalle périodique un signal indiquant "j'en suis là" et Qt (qui, lui, ne doit surtout pas tourner dans un thread mais en principal) récupère ce signal pour mettre alors à jour le label. Mais comme le travail est fait dans le thread, cela ne freeze pas Qt.

    Citation Envoyé par rg71800 Voir le message
    et autre question qui n'a rien a voir, comment faites vous pour mettre des parties de vos réponses sur fond gris ?
    Tu prends un de mes posts et tu fais "répondre avec citation". Cela te recopiera mon post dans le tien et là tu pourras voir comment je fais...
    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]

Discussions similaires

  1. Programme de remplacement de texte dans des fichiers
    Par Invité4 dans le forum Linux
    Réponses: 13
    Dernier message: 12/11/2006, 17h06
  2. Remplacer un texte dans une cellule Excel à partir d'un point donné
    Par tonyC dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/04/2006, 20h05
  3. remplacer du texte dans un tableau généré
    Par jcaruana dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/02/2006, 17h36
  4. [Tkinter] ecrire un texte dans un widget entry
    Par thierry_b dans le forum Tkinter
    Réponses: 3
    Dernier message: 15/12/2005, 12h38
  5. [langage] Remplacer du texte dans un fichier
    Par Michaël dans le forum Langage
    Réponses: 9
    Dernier message: 11/03/2005, 16h19

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