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 :

Appliquer une fonction à un bouton


Sujet :

PyQt Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 30
    Points : 22
    Points
    22
    Par défaut Appliquer une fonction à un bouton
    Bonjour,

    je cherche à faire une petite interface permettant d'envoyer/recevoir et afficher les trames envoyées/reçues pour cela je me suis mis à PyQt5 et apres plusieurs recherche sur internet j'en arrive à ç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
    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
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    class Ui_GroupBox():#object):
     
        def UDP_COMM():
            print 'cest parti'
            IP             = "192.168.1.17"
            PORT           = 31313
            Message        = "55032002"
            Data           = Message.decode('hex')
     
            s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        ##    print "j'envoi : ",Message
            s.sendto(Data,(IP,PORT))
     
            flag = 1
     
            while flag == 1:
     
                data,addr = s.recvfrom(1024)
     
        ##        print "addresse :",addr
     
                datahex = ':'.join(x.encode('hex') for x in data)
        ##        print "message recu (1): ",datahex
     
                if datahex != '':
                    flag = 0
     
     
            tampon = datahex.replace(':00:',':0a:')
     
            tampon2 = tampon[12:len(tampon)-3].replace(':','')
     
            messagedecode = (bytearray.fromhex(tampon2).decode())
        ##    print "Message recu (2): \n",messagedecode
            return messagedecode,Message
     
     
     
        def acquisition():
     
     
            global ToSend
            global ToReceive
     
            messagedecode, messageenvoye = UDP_COMM()
            date = time.strftime("%d/%m/%Y  %H:%M:%S")
     
            try:
                ToSend = ToSend + "\n" + date + " >>> " + messageenvoye
                ToReceive = ToReceive + "\n" + date + " >>> " + messagedecode
     
            except:
                ToSend = date + " >>> " + messageenvoye
                ToReceive = date + " >>> " + messagedecode
     
        def wrapper():
            test()
        def test():
            print "salut"
     
        def setupUi(self,GroupBox):
     
            GroupBox.setObjectName("GroupBox")
            GroupBox.resize(400, 320)
     
            self.pushButton = QtWidgets.QPushButton(GroupBox)
     
            self.pushButton.setGeometry(QtCore.QRect(280, 210, 113, 32))
            self.pushButton.setObjectName("pushButton")
     
     
            self.MaZoneText1 = QtWidgets.QTextEdit(GroupBox)
     
            self.MaZoneText1.setGeometry(QtCore.QRect(10, 30, 241, 141))
            self.MaZoneText1.setReadOnly(True)
            self.MaZoneText1.setObjectName("MaZoneText1")
            self.MaZoneText1.append('salut')
     
            self.retranslateUi(GroupBox)
            QtCore.QMetaObject.connectSlotsByName(GroupBox)
    ##        self.pushButton.clicked(connect(wrapper)) ## <<<< probleme à ce niveau voir dans Quote
     
     
        def retranslateUi(self,GroupBox):
     
            _translate = QtCore.QCoreApplication.translate
            GroupBox.setWindowTitle(_translate("GroupBox", "GroupBox"))
            GroupBox.setTitle(_translate("GroupBox", "GroupBox"))
            self.pushButton.setText(_translate("GroupBox", "Envoyer"))
    Traceback (most recent call last):
    File "/Users/R.../Desktop/test/main.py", line 22, in <module>
    myapp = ShipHolderApplication()
    File "/Users/R.../Desktop/test/main.py", line 12, in __init__
    self.createWidgets()
    File "/Users/R.../Desktop/test/main.py", line 16, in createWidgets
    self.ui.setupUi(self)
    File "/Users/R.../Desktop/test/groupbox.py", line 93, in setupUi
    self.pushButton.clicked(connect(wrapper))
    NameError: global name 'connect' is not defined
    Que j'execute avec:

    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
     
    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    from groupbox import *#Ui_GroupBox
     
    class ShipHolderApplication(QGroupBox):
     
            def __init__(self,parent=None):
                super (ShipHolderApplication,self).__init__(parent)
                self.createWidgets()
     
            def createWidgets(self):
                self.ui = Ui_GroupBox()
                self.ui.setupUi(self)
     
     
    if __name__ == "__main__":
     
            app = QApplication(sys.argv)
            myapp = ShipHolderApplication()
            myapp.show()
            sys.exit(app.exec_())

    ma question est donc la suivante, comment je peux faire pour que mon bouton execute une fonction idéalement "acquisition" vu que celle ci se charge du reste (j'ai créé des fonction test wrapper et test, mais rien ne se passe comme je le veux). L'idée serait ensuite que ce qui est réceptionné s'affiche dans des Box ensuite.
    Le code de l'interface a été généré avec QT en .ui puis converti en .py grace à pyuic5

    NB/ Je suis débutant, j'accepterai toute critique constructive

    Vous en remerciant par avance,

    Cordialement,
    moa131.

  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,

    clicked est un signal qui est une classe et connect en est une méthode.
    wrapper est une méthode de ta classe.

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            self.pushButton.clicked.connect(self.wrapper)

    NB/ Je suis débutant, j'accepterai toute critique constructive
    si tu le demandes, revois ton deuxième code comme ceci
    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
     
    import sys
    from PyQt5.QtWidgets import QApplication, QGroupBox, 
    from groupbox import Ui_GroupBox
     
    class ShipHolderApplication(QGroupBox):
            def __init__(self, parent=None):
                super().__init__(parent)
                self.createWidgets()
     
            def createWidgets(self):
                self.ui = Ui_GroupBox()
                self.ui.setupUi(self)
     
    if __name__ == "__main__":
            app = QApplication(sys.argv)
            myapp = ShipHolderApplication()
            myapp.show()
            sys.exit(app.exec_())
    Les imports "en vrac" n'ont pas de raison d'être.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Merci pour votre réponse, celle-ci à un petit probleme, lorsque je l'execute il n'y a aucun message d'erreur mais me provoque la fermeture de la fenetre, et lorsque je le re-execute une fenetre s'ouvre:
    The last time you opened Python, it unexpectedly quit while reopening windows. Do you want to try to reopen its windows again ? if you choose not to reopen windows, you may have to open and position the windows yourself. [Don't Reopen] [Reopen]
    Avez vous une idée de comment fixer cela ?

    Vous en remerciant par avance,
    cordialement
    moa131

  4. #4
    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
    Je m'étais contenté de solutionner ton problème de connexion, mais en y regardant de plus près ton code ne peut effectivement pas fonctionner comme ça.

    Tu as omis self à divers endroits par exemple.

    J'ai mis ton code au propre:
    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
     
    class Ui_GroupBox:
     
        def UDP_COMM(self):
            IP             = "192.168.1.17"
            PORT           = 31313
            Message        = "55032002"
            Data           = Message.decode('hex')
            s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
            s.sendto(Data,(IP,PORT))
     
            flag = 1
            while flag == 1:
                data,addr = s.recvfrom(1024)
                datahex = ':'.join(x.encode('hex') for x in data)
                if datahex != '':
                    flag = 0
     
            tampon = datahex.replace(':00:',':0a:')
            tampon2 = tampon[12:len(tampon)-3].replace(':','')
            messagedecode = (bytearray.fromhex(tampon2).decode())
            return messagedecode,Message
     
        def acquisition(self):
            messagedecode, messageenvoye = self.UDP_COMM()
            date = time.strftime("%d/%m/%Y  %H:%M:%S")
            try:
                ToSend = ToSend + "\n" + date + " >>> " + messageenvoye
                ToReceive = ToReceive + "\n" + date + " >>> " + messagedecode
            except:
                ToSend = date + " >>> " + messageenvoye
                ToReceive = date + " >>> " + messagedecode
     
        def wrapper(self):
            self.test()
     
        def test(self):
            print("salut")
     
        def setupUi(self, GroupBox):
            GroupBox.setObjectName("GroupBox")
            GroupBox.resize(400, 320)
            self.pushButton = QtWidgets.QPushButton(GroupBox)
            self.pushButton.setGeometry(QtCore.QRect(280, 210, 113, 32))
            self.pushButton.setObjectName("pushButton")
            self.MaZoneText1 = QtWidgets.QTextEdit(GroupBox)
            self.MaZoneText1.setGeometry(QtCore.QRect(10, 30, 241, 141))
            self.MaZoneText1.setReadOnly(True)
            self.MaZoneText1.setObjectName("MaZoneText1")
            self.MaZoneText1.append('salut')
            self.retranslateUi(GroupBox)
            QtCore.QMetaObject.connectSlotsByName(GroupBox)
            self.pushButton.clicked.connect(self.wrapper)
     
        def retranslateUi(self, GroupBox):
            _translate = QtCore.QCoreApplication.translate
            GroupBox.setWindowTitle(_translate("GroupBox", "GroupBox"))
            GroupBox.setTitle(_translate("GroupBox", "GroupBox"))
            self.pushButton.setText(_translate("GroupBox", "Envoyer"))
    Il ne se plante plus mais ça ne veux pas dire qu'il est fonctionnel, par exemple je ne vois pas à quoi sert la méthode aquisition ...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    la méthode acquisition est là simplement parce que j'ai copié coller mon code fonctionnel que j'avais écris sur TKinter qui ne me fournissais pas de bon rendu c'est pour ca que je me suis tourné sur PyQt, je n'ai pas vraiment commencer à virer ce qui n'était plus nécessaire, pour le moment j'essaie juste de faire fonctionner mon bouton et mon affichage dans ma box

  6. #6
    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
    Ben oui ma copie n'a pas repris les imports, rajoute-les alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from PyQt5 import QtCore, QtGui, QtWidgets

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    Oui je m'en suis aperçu désolé pour ma question stupide

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    je reviens vers vous pour une autre question, j'arrive bien à afficher du texte dans ma box, cependant lorsque j'appuie sur le bouton, seul l'instruction *evenement: bouton appuyer executer UDP_COMM* s'effectue mais j'ai besoin qu'il mette à jour le contenu de la box à chaque clic, voici où j'en suis:

    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
     
     
    from PyQt5 import QtCore, QtGui, QtWidgets
    import encodings
    import socket
    import time
     
     
    ToSend = ''
     
     
    class Ui_GroupBox:
     
        def UDP_COMM(self):
     
            global ToSend
     
            print 'cest parti'
     
            IP             = "192.168.1.17"
            PORT           = 31313
            Message        = "55032002"
            Data           = Message.decode('hex')
            s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
            s.sendto(Data,(IP,PORT))
     
            flag = 1
            while flag == 1:
                data,addr = s.recvfrom(1024)
                datahex = ':'.join(x.encode('hex') for x in data)
                if datahex != '':
                    flag = 0
     
            tampon = datahex.replace(':00:',':0a:')
            tampon2 = tampon[12:len(tampon)-3].replace(':','')
            messagedecode = (bytearray.fromhex(tampon2).decode())
     
            print 'cest fini'
     
            date = time.strftime("%d/%m/%Y  %H:%M:%S")
     
            try:
                ToSend = ToSend + "\n" + date + " >>> " + Message
                self.ToReceive = self.ToReceive + "\n" + date + " >>> " + messagedecode
            except:
                ToSend = date + " >>> " + Message
                self.ToReceive = date + " >>> " + messagedecode
            print 'UDP_COMM: ',ToSend
     
        def setupUi(self, GroupBox):
     
            global ToSend
     
            GroupBox.setObjectName("GroupBox")
            GroupBox.resize(400, 320)
            self.pushButton = QtWidgets.QPushButton(GroupBox)
            self.pushButton.setGeometry(QtCore.QRect(280, 210, 113, 32))
            self.pushButton.setObjectName("pushButton")
            self.MaZoneText1 = QtWidgets.QTextEdit(GroupBox)
            self.MaZoneText1.setGeometry(QtCore.QRect(10, 30, 241, 141))
            self.MaZoneText1.setReadOnly(True)
            self.MaZoneText1.setObjectName("MaZoneText1")
            #Ui_GroupBox.UDP_COMM(self) # << à dé-commenter pour afficher ToSend la premiere fois, mais non nécessaire       # pour la suite si probleme résolu
     
            self.pushButton.clicked.connect(self.UDP_COMM) # lance UDP_COMM lorsque pressé
            self.MaZoneText1.append(ToSend) # affiche le contenue de ToSend dans box <<<< ne se lance pas lorsque bouton pressé, est il possible de le déporté dans une fonction ? je n'y arrive pas
     
            self.retranslateUi(GroupBox)
            QtCore.QMetaObject.connectSlotsByName(GroupBox)
     
        def retranslateUi(self, GroupBox):
            _translate = QtCore.QCoreApplication.translate
            GroupBox.setWindowTitle(_translate("GroupBox", "GroupBox"))
            GroupBox.setTitle(_translate("GroupBox", "GroupBox"))
            self.pushButton.setText(_translate("GroupBox", "Envoyer"))
    J'ai essayé de déporté :
    self.MaZoneText1.append(ToSend)
    dans une fonction mais je n'y arrive pas.


    Vous en remerciant par avance,
    Cordialement

    rom131

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 30
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Probleme résolu, voici ma solution finale:
    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
     
     
    from PyQt5 import QtCore, QtGui, QtWidgets
    import encodings
    import socket
    import time
     
     
    ToSend                     = ''
     
    class Ui_GroupBox:
     
        def UDP_COMM(self):
     
            global ToSend
     
            IP                 = "192.168.1.17"
            PORT               = 31313
            Message            = "55032002"
            Data               = Message.decode('hex')
            s                  = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
            s.sendto(Data,(IP,PORT))
     
            flag               = 1
     
            while flag == 1:
                data,addr      = s.recvfrom(1024)
                datahex        = ':'.join(x.encode('hex') for x in data)
                if datahex != '':
                    flag   = 0
     
            tampon             = datahex.replace(':00:',':0a:')
            tampon2            = tampon[12:len(tampon)-3].replace(':','')
            messagedecode      = (bytearray.fromhex(tampon2).decode())
            date               = time.strftime("%d/%m/%Y  %H:%M:%S")
     
            ToSend         = date + " >>> " + Message
     
     
            print 'UDP_COMM: ',ToSend
     
        def setupUi(self, GroupBox):
     
            global ToSend
     
            GroupBox.setObjectName("GroupBox")
            GroupBox.resize(400, 320)
     
            self.pushButton    = QtWidgets.QPushButton(GroupBox)
     
            self.pushButton.setGeometry(QtCore.QRect(280, 210, 113, 32))
            self.pushButton.setObjectName("pushButton")
     
            self.MaZoneText1   = QtWidgets.QTextEdit(GroupBox)
     
            self.MaZoneText1.setGeometry(QtCore.QRect(10, 30, 241, 141))
            self.MaZoneText1.setReadOnly(True)
     
     
            self.pushButton.clicked.connect(self.UDP_COMM)
            self.pushButton.clicked.connect(self.test)  
     
     
            self.retranslateUi(GroupBox)
            QtCore.QMetaObject.connectSlotsByName(GroupBox)
     
        def test(self,GroupBox):
     
            global ToSend
     
            self.MaZoneText1.setGeometry(QtCore.QRect(10, 30, 241, 141))
            self.MaZoneText1.setReadOnly(True)
            self.MaZoneText1.setObjectName("MaZoneText1")
            self.MaZoneText1.append(ToSend)
     
        def retranslateUi(self, GroupBox):
     
            _translate         = QtCore.QCoreApplication.translate
     
            GroupBox.setWindowTitle(_translate("GroupBox", "GroupBox"))
            GroupBox.setTitle(_translate("GroupBox", "GroupBox"))
            self.pushButton.setText(_translate("GroupBox", "Envoyer"))
    Merci beaucoup pour votre aide

    moa131

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/07/2007, 14h03
  2. Réponses: 3
    Dernier message: 08/06/2007, 13h09
  3. appliquer une fonction à toutes les balises <a>
    Par trotters213 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/10/2006, 16h49
  4. [MySQL] Appliquer une fonction sur un champ lors d'une requête
    Par Jérémy197 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/08/2006, 13h29
  5. Peut-on appliquer une fonction sur un champs ajouté?
    Par tinwul dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 31/05/2006, 17h02

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