Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2651 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Python : récupérer données inter class ??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Python : récupérer données inter class ??

n°2520773
erwan83
Du Shift DEL tu te méfieras !
Posté le 23-03-2026 à 17:36:23  profilanswer
 

Bonjour
Ce code récupère les données sur une BDD et met à jour des champs, puis est censé lancer une représentation graphique en fonction de la personne sélectionnée
J'ai donc deux fonctions qui mettent à jour les données.
Dans la class PREMIER_BLOC, aucun problème, tout fonctionne (j'ai un peu allégé le code pour aller à l'essentiel lol)
Dans la dernière fonction, je tente de faire un return de mes trois valeurs :
NOM
PRENOM
DATE DE NAISSANCE
 
Mon soucis :
J'ai deux autres class dont une qui lance une représentation graphique
Je voudrais savoir comment je peux :
- VERIFIER QUE DES DONNEES ONT ETE TRAITEES
- RECUPERER CES DONNEES
J'ai donc tenté avec le return mais je n'arrive pas à appeler mes données depuis l'autre class....
 
 

Code :
  1. class PREMIER_BLOC(QtWidgets.QWidget):
  2.     def __init__(self, parent=None):
  3.         super(PREMIER_BLOC, self).__init__(parent)
  4.        
  5.         self.LAYOUT_1 = QtWidgets.QHBoxLayout()
  6.         con_strength = QtWidgets.QLabel("BOUTON" )
  7.         self.LAYOUT_1.addWidget(con_strength)
  8.        
  9.     ### 1ere HBox
  10.         self.H_BOX1 = QtWidgets.QHBoxLayout()
  11.        
  12.         self.NOM_Input = QtWidgets.QLineEdit()
  13.         self.NOM_Input.textChanged.connect(self.click_NOM_Input)
  14.         self.H_BOX1.addWidget(self.NOM_Input)
  15.         self.NOM_Corresp = QtWidgets.QLabel(self)
  16.         self.NOM_Corresp.setFixedSize(150,21)
  17.         self.H_BOX1.addWidget(self.NOM_Corresp)
  18.     ### 2eme HBox
  19.         self.H_BOX2 = QtWidgets.QHBoxLayout()
  20.         self.PRENOM_Input = QtWidgets.QLineEdit()
  21.         self.PRENOM_Input.textChanged.connect(self.click_PRENOM_Input)
  22.         self.H_BOX2.addWidget(self.PRENOM_Input)
  23.         self.PRENOM_Corresp = QtWidgets.QLabel(self)
  24.         self.H_BOX2.addWidget(self.PRENOM_Corresp)
  25.        
  26.     ### 3eme HBox
  27.         self.H_BOX3 = QtWidgets.QHBoxLayout()
  28.         self.DATE_DE_NAISSANCE_Input = QtWidgets.QLineEdit(self)
  29.         self.H_BOX3.addWidget(self.DATE_DE_NAISSANCE_Input)
  30.         self.DATE_DE_NAISSANCE_Corresp = QtWidgets.QLabel(self)
  31.         self.H_BOX3.addWidget(self.DATE_DE_NAISSANCE_Corresp)
  32.     ### Ajout addStretch pour les espacements
  33.         self.H_BOX1.addStretch()
  34.         self.H_BOX2.addStretch()
  35.         self.H_BOX3.addStretch()
  36.        
  37.         self.V_BOX1 = QtWidgets.QVBoxLayout()
  38.         self.V_BOX1.addLayout(self.H_BOX1)
  39.         self.V_BOX1.addLayout(self.H_BOX2)
  40.         self.V_BOX1.addLayout(self.H_BOX3)
  41.         self.V_BOX1.addLayout(self.LAYOUT_1)
  42.         self.V_BOX1.addStretch()
  43.         Concrete_Group = QtWidgets.QGroupBox()
  44.         Concrete_Group.setTitle('Choix de la personne')
  45.         Concrete_Group.setLayout(self.V_BOX1)
  46.         lay = QtWidgets.QVBoxLayout(self)
  47.         lay.addWidget(Concrete_Group)
  48.     #@QtCore.pyqtSlot(int)
  49.     def click_NOM_Input(self):
  50.         Nom_frappe = self.NOM_Input.text()
  51.         self.NOM_Corresp.setText(Nom_frappe)
  52.         ligne = "%s%s%s" % ("SELECT NOM FROM CLIENTELE WHERE UPPER(NOM) LIKE '",Nom_frappe.upper(), "%'" )
  53.         lancesql(ligne)
  54.         conn.commit()
  55.         records = cursor.fetchall()
  56.         for row in records:
  57.             if row[0].upper() == Nom_frappe.upper():
  58.                 self.NOM_Corresp.setText(row[0].upper())
  59.     def click_PRENOM_Input(self):
  60.         Prenom_frappe = self.PRENOM_Input.text()
  61.         Nom_frappe = self.NOM_Input.text()
  62.         self.PRENOM_Corresp.setText(Prenom_frappe)
  63.         print(Prenom_frappe)
  64.         ligne = "%s%s%s" % ("SELECT PRENOM, NOM FROM CLIENTELE WHERE UPPER(PRENOM) LIKE '",Prenom_frappe.upper(), "%'" )
  65.         lancesql(ligne)
  66.         conn.commit()
  67.         records = cursor.fetchall()
  68.         for row in records:
  69.             if row[0].upper() == Prenom_frappe.upper() and row[1].upper() == Nom_frappe.upper():
  70.                 self.PRENOM_Corresp.setText(row[0].upper())
  71.         ligne = "%s%s%s%s%s" % ("SELECT NOM,PRENOM, DATE_NAISSANCE FROM CLIENTELE WHERE UPPER(PRENOM) LIKE '",Prenom_frappe.upper(), "%' AND UPPER(NOM) LIKE '",Nom_frappe.upper(), "%'" )
  72.         lancesql(ligne)
  73.         conn.commit()
  74.         records = cursor.fetchall()
  75.         for row in records:
  76.             print(row[0],row[1],row[2])
  77.             self.DATE_DE_NAISSANCE_Corresp.setText(row[2])
  78.             self.DATE_DE_NAISSANCE_Input.setText(row[2])
  79.             return(Prenom_frappe,Nom_frappe,self.DATE_DE_NAISSANCE_Input.text())


Message édité par erwan83 le 23-03-2026 à 17:40:22

---------------
https://www.oise-net-multiservices.com
mood
Publicité
Posté le 23-03-2026 à 17:36:23  profilanswer
 

n°2520781
rat de com​bat
attention rongeur méchant!
Posté le 23-03-2026 à 19:25:01  profilanswer
 

Tu devrais de toute urgence te renseigner sur les injections SQL!


---------------
-/-
n°2520930
boutlatent
Posté le 25-03-2026 à 16:44:28  profilanswer
 

Il faudrait aussi séparer ce qui est requêtes sql et l'interface graphique.
 
Qu'entends-tu par « J'ai donc tenté avec le return mais je n'arrive pas à appeler mes données depuis l'autre class » ?
 
C'est de la méthode click_NOM_Input dont tu parles pour ton return ? Si c'est le cas, elle doit être appelée par plusieurs autres objets différents de ton application ?


---------------
La connerie est la décontraction de l'intelligence.
n°2521366
erwan83
Du Shift DEL tu te méfieras !
Posté le 31-03-2026 à 22:55:21  profilanswer
 

class_1:
   ### etc etc etc
def fonction(self)
   tralala fonction tut tut
   x = 1
   z = 4
   y = 2+z
   #etc
   return(x,y)
 
class_2:
 
trucX = class_1().fonction(x)
trucY = class_1().fonction(y)
 
j'essaye de me renseigner mais c'est chaud !!


---------------
https://www.oise-net-multiservices.com
n°2521380
boutlatent
Posté le 01-04-2026 à 10:04:55  profilanswer
 

Je n'ai rien compris :o
 
trucX et trucY sont dans ton exemple des variables de classes.


---------------
La connerie est la décontraction de l'intelligence.
n°2521466
erwan83
Du Shift DEL tu te méfieras !
Posté le 01-04-2026 à 18:54:30  profilanswer
 


 
Voici mon bout de code :
Dans la première class j'ai mes LABEL, INPUT et encore LABEL pour afficher les correspondances trouvées dans la BDD
 
je vais chercher à partir de NOM_Input et PRENOM_Input des personnes dans la BDD CLIENTELE
avec :  
    def click_NOM_Input(self):
    def click_PRENOM_Input(self):
 
je récupère donc mes valeurs suivantes :
        Prenom_frappe
        Nom_frappe
 
je cherche dans la BDD et je confirme, ça me sort : (lignes 91 à 109)
        Date_Naissance_frappe
 
je lance une deuxième fois une recherche BDD (ça reste à améliorer...) (lignes 93 à 103)
 
La deuxième class est vide pour l'instant.
 
Dans la troisième class je voudrais faire une représentation graphique (ça marchait à la base... mais en faisant des corrections je me suis planté)
Donc je définis mon canvas QPixmap déjà dans ma class
Mais je le recrée dans la fonction du dessous.
 
Et là où je panique, c'est que rien ne s'affiche...
 
Donc voilà, désolé pour le gros code mais tout y est (ou presque)
 
Si une âme charitable peut m'aider.....
 

Code :
  1. import psycopg2
  2. import sys
  3. import math
  4. from PyQt6.QtWidgets import QApplication, QPushButton, QWidget, QLineEdit,QDialog, QLabel, QCalendarWidget,QMessageBox,QComboBox,QVBoxLayout,QHBoxLayout,QGridLayout,QLayout
  5. from PySide6.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,QRect, QSize, QUrl, Qt)
  6. from PyQt6.QtGui import QBrush, QPainter, QPen, QPixmap, QColor,QFont
  7. from PyQt6 import QtWidgets, QtCore, QtGui
  8. class PREMIER_BLOC(QtWidgets.QWidget):
  9.     def __init__(self, parent=None):
  10.         super(PREMIER_BLOC, self).__init__(parent)
  11.        
  12.         self.LAYOUT_1 = QtWidgets.QHBoxLayout()
  13.        
  14.     ### 1ere HBox
  15.         self.H_BOX1 = QtWidgets.QHBoxLayout()
  16.        
  17.         self.NOM_Label = QtWidgets.QLabel('Nom :')
  18.         self.H_BOX1.addWidget(self.NOM_Label)
  19.         self.NOM_Input = QtWidgets.QLineEdit()
  20.         self.NOM_Input.textChanged.connect(self.click_NOM_Input)
  21.         self.H_BOX1.addWidget(self.NOM_Input)
  22.         self.NOM_Corresp = QtWidgets.QLabel(self)
  23.         self.H_BOX1.addWidget(self.NOM_Corresp)
  24.     ### 2eme HBox
  25.         self.H_BOX2 = QtWidgets.QHBoxLayout()
  26.         self.PRENOM_Label = QtWidgets.QLabel('Prénom :'))')
  27.         self.H_BOX2.addWidget(self.PRENOM_Label)
  28.         self.PRENOM_Input = QtWidgets.QLineEdit()
  29.         self.PRENOM_Input.textChanged.connect(self.click_PRENOM_Input)
  30.         self.H_BOX2.addWidget(self.PRENOM_Input)
  31.         self.PRENOM_Corresp = QtWidgets.QLabel(self)
  32.         self.H_BOX2.addWidget(self.PRENOM_Corresp)
  33.        
  34.     ### 3eme HBox
  35.         self.H_BOX3 = QtWidgets.QHBoxLayout()
  36.         self.DATE_DE_NAISSANCE_Label = QtWidgets.QLabel('Date de naissance :')
  37.         self.H_BOX3.addWidget(self.DATE_DE_NAISSANCE_Label)
  38.         self.DATE_DE_NAISSANCE_Input = QtWidgets.QLineEdit(self)
  39.         self.H_BOX3.addWidget(self.DATE_DE_NAISSANCE_Input)
  40.         self.DATE_DE_NAISSANCE_Corresp = QtWidgets.QLabel(self)
  41.         self.H_BOX3.addWidget(self.DATE_DE_NAISSANCE_Corresp)
  42.                
  43.     ### Ajout addStretch pour les espacements
  44.         self.H_BOX1.addStretch()
  45.         self.H_BOX2.addStretch()
  46.         self.H_BOX3.addStretch()
  47.        
  48.         self.V_BOX1 = QtWidgets.QVBoxLayout()
  49.         self.V_BOX1.addLayout(self.H_BOX1)
  50.         self.V_BOX1.addLayout(self.H_BOX2)
  51.         self.V_BOX1.addLayout(self.H_BOX3)
  52.         self.V_BOX1.addLayout(self.LAYOUT_1)
  53.         self.V_BOX1.addStretch()
  54.         Concrete_Group = QtWidgets.QGroupBox()
  55.         Concrete_Group.setTitle('Choix de la personne')
  56.         Concrete_Group.setLayout(self.V_BOX1)
  57.         lay = QtWidgets.QVBoxLayout(self)
  58.         lay.addWidget(Concrete_Group)
  59.     def click_NOM_Input(self):
  60.         Nom_frappe = self.NOM_Input.text()
  61.         self.NOM_Corresp.setText(Nom_frappe)
  62.         ligne = "%s%s%s" % ("SELECT NOM FROM CLIENTELE WHERE UPPER(NOM) LIKE '",Nom_frappe.upper(), "%'" )
  63.         lancesql(ligne)
  64.         conn.commit()
  65.         records = cursor.fetchall()
  66.         for row in records:
  67.             if row[0].upper() == Nom_frappe.upper():
  68.                 self.NOM_Corresp.setText(row[0].upper())
  69.     def click_PRENOM_Input(self):
  70.         Prenom_frappe = self.PRENOM_Input.text()
  71.         Nom_frappe = self.NOM_Input.text()
  72.         Date_Naissance_frappe = self.DATE_DE_NAISSANCE_Input.text()
  73.         self.PRENOM_Corresp.setText(Prenom_frappe)
  74.         print(Prenom_frappe)
  75.         ligne = "%s%s%s" % ("SELECT PRENOM, NOM FROM CLIENTELE WHERE UPPER(PRENOM) LIKE '",Prenom_frappe.upper(), "%'" )
  76.         lancesql(ligne)
  77.         conn.commit()
  78.         records = cursor.fetchall()
  79.         for row in records:
  80.             if row[0].upper() == Prenom_frappe.upper() and row[1].upper() == Nom_frappe.upper():
  81.                 self.PRENOM_Corresp.setText(row[0].upper())
  82.         ligne = "%s%s%s%s%s" % ("SELECT NOM,PRENOM, DATE_NAISSANCE FROM CLIENTELE WHERE UPPER(PRENOM) LIKE '",Prenom_frappe.upper(), "%' AND UPPER(NOM) LIKE '",Nom_frappe.upper(), "%'" )
  83.         lancesql(ligne)
  84.         conn.commit()
  85.         records = cursor.fetchall()
  86.         for row in records:
  87.             if row[0].upper() == Nom_frappe.upper() and row[1].upper() == Prenom_frappe.upper():
  88.                 print(row[0],row[1],row[2])
  89.                 self.DATE_DE_NAISSANCE_Corresp.setText(row[2])
  90.                 self.DATE_DE_NAISSANCE_Input.setText(row[2])
  91.                 print(Prenom_frappe,Nom_frappe,Date_Naissance_frappe)
  92.                 return(Prenom_frappe,Nom_frappe,Date_Naissance_frappe)
  93.        
  94. ### SECOND BLOC
  95. class SECOND_BLOC(QtWidgets.QWidget):
  96.     def __init__(self, parent=None):
  97.         super(SECOND_BLOC, self).__init__(parent)
  98. ### TROISIEME BLOC
  99. class TROISIEME_BLOC(QtWidgets.QWidget):
  100.     def __init__(self, parent=None):
  101.         super(TROISIEME_BLOC, self).__init__(parent)
  102.         V_BOX1 = QtWidgets.QVBoxLayout(self)
  103.         self.H_BOX4 = QtWidgets.QHBoxLayout()
  104.         self.BTN_RECHERCHER_LIENS = QtWidgets.QPushButton('Rechercher',self)
  105.         self.BTN_RECHERCHER_LIENS.clicked.connect(self.RECHERCHER_LIENS)
  106.         self.H_BOX4.addWidget(self.BTN_RECHERCHER_LIENS)
  107.         TROISIEME_BLOC.label = QtWidgets.QLabel()
  108.         canvas = QtGui.QPixmap(1600,1600)
  109.         canvas.fill(QColor("white" ))
  110.         TROISIEME_BLOC.label.setPixmap(canvas)
  111.         V_BOX1.addWidget(self.BTN_RECHERCHER_LIENS)
  112.         V_BOX1.addWidget(self.label)
  113.         TROISIEME_BLOC.label.setPixmap(canvas)
  114.    
  115.     def RECHERCHER_LIENS(self):
  116.         Prenom_frappe = PREMIER_BLOC.click_NOM_Input(Prenom_frappe)
  117.         Nom_frappe = PREMIER_BLOC.click_PRENOM_Input(Nom_frappe)
  118.         Date_Naissance_frappe = PREMIER_BLOC.click_PRENOM_Input(Date_Naissance_frappe)
  119.         ### PREMIERE BOUCLE : RECHERCHE DES RELATIONS
  120.         ligne = "%s%s%s%s%s" % ("SELECT PRENOM_ORIGINE,NOM_ORIGINE,DATE_NAISSANCE_ORIGINE,PRENOM_DESTINATION,NOM_DESTINATION,DATE_NAISSANCE_DESTINATION,TYPE_DE_RELATION FROM RELATION WHERE UPPER(PRENOM_ORIGINE) LIKE '",Prenom_frappe.upper(), "%' AND UPPER(NOM_ORIGINE) LIKE '",Nom_frappe.upper(), "%'" )
  121.         lancesql(ligne)
  122.         conn.commit()
  123.         records = cursor.fetchall()
  124.        
  125.         compte = 0
  126.         Nom_Destination =[]
  127.         Prenom_Destination =[]
  128.         Relation =[]
  129.         canvas = QtGui.QPixmap(1600,1600)
  130.         canvas.fill(QColor("white" ))
  131.         self.label.setPixmap(canvas)
  132.         canvas = self.label.pixmap()
  133.         painter = QtGui.QPainter(canvas)
  134.                
  135.         for row1 in records:
  136.             compte = compte+1
  137.             print(row1[1],row1[0],'=>',row1[4],row1[3],row1[6])
  138.             Nom_Destination.append(row1[4])
  139.             Prenom_Destination.append(row1[3])
  140.             Relation.append(row1[6])
  141.         if compte == 0:
  142.             print("aucune relation" )
  143.         if compte > 0:
  144.             print(Nom_frappe)
  145.             print(Prenom_frappe)
  146.             print(Nom_Destination)
  147.            
  148.             ### PREMIERE BOUCLE : NOM PRENOM DE DEPART =>
  149.             texte = "%s %s" % (Nom_frappe.upper(),Prenom_frappe.capitalize())
  150.             painter.drawText(750,800,texte)
  151.             ### PREMIERE BOUCLE : CENTRE DE DEPART
  152.             center = [800,800]
  153.             ### PREMIERE BOUCLE : TABLEAU DES COORDONNEES D'ARRIVEE
  154.             CoordX=[]
  155.             CoordY=[]
  156.             ### PREMIERE BOUCLE : SI ON A DES DESTINATIONS
  157.             if len(Nom_Destination) >0 :
  158.                 painter.setPen(QColor(100, 100, 100, 120))
  159.                 for index in range (0,len(Nom_Destination),1):
  160.                     ### PREMIERE BOUCLE : INCREMENTATION DES COORDONNEES D'ARRIVEE
  161.                     xC = int(center[0] + 250*math.cos((40/(len(Nom_Destination)+1))*index))
  162.                     yC = int(center[1] + 250*math.sin((40/(len(Nom_Destination)+1)*index)))
  163.                     CoordX.append(xC)
  164.                     CoordY.append(yC)
  165.                     ### PREMIERE BOUCLE : TRACE DES LIGNES
  166.                     print("dessin ligne" )
  167.                     painter.drawLine(center[0],center[1],xC,yC)
  168.                     painter.setPen(QColor(0, 0, 0, 225))
  169.                     painter.setFont(QFont("Arial", 12))
  170.                     ### PREMIERE BOUCLE : TRACE DES NOMS
  171.                     texte = "%s %s" % (Nom_Destination[index].upper(),Prenom_Destination[index].capitalize())
  172.                     print("dessin texte" )
  173.                     painter.drawText(xC-40,yC,texte)
  174.                     painter.setPen(QColor(0, 0, 0, 225))
  175.                     painter.setFont(QFont("Arial", 10))
  176.                     texte = Relation[index]
  177.                     print("dessin texte" )
  178.                     painter.drawText(int(xC/2+center[0]/2)-20,int(yC/2+center[1]/2),texte)
  179.                    
  180.                     for index in range(0,len(Nom_Destination),1):
  181.                         ### DEUXIEME BOUCLE : RECHERCHE DES RELATIONS
  182.                         ligne = "%s%s%s%s%s%s%s%s%s" % ("SELECT PRENOM_ORIGINE,NOM_ORIGINE,DATE_NAISSANCE_ORIGINE,PRENOM_DESTINATION,NOM_DESTINATION,DATE_NAISSANCE_DESTINATION,TYPE_DE_RELATION FROM RELATION \
  183.                                                 WHERE UPPER(PRENOM_DESTINATION) NOT LIKE '",Prenom_frappe.upper(), "' AND UPPER(NOM_DESTINATION) NOT LIKE '",Nom_frappe.upper(), "' AND \
  184.                                                 UPPER(PRENOM_ORIGINE) LIKE '",Prenom_Destination[index], "%' AND UPPER(NOM_ORIGINE) LIKE '",Nom_Destination[index], "%'" )
  185.                         lancesql(ligne)
  186.                         conn.commit()
  187.                         records2 = cursor.fetchall()
  188.                         compte_2 = 0
  189.                         Nom_Destination_indice =[]
  190.                         Prenom_Destination_indice =[]
  191.                         Relation_indice =[]
  192.                         for row2 in records2:
  193.                            
  194.                             Nom_Destination_indice.append(row2[4])
  195.                             Prenom_Destination_indice.append(row2[3])
  196.                             Relation_indice.append(row2[6])
  197.                             compte_2 = compte_2+1
  198.                         if compte_2 > -1:
  199.                             compte_2 = compte_2 -1
  200.                             center = [CoordX[compte_2],CoordY[compte_2]]
  201.                             Nom_Origine = row2[1]
  202.                             Prenom_Origine = row2[0]
  203.                             #### LANCER UNE DEUXIEME FONCTION
  204.                             for index_2 in range(0,compte_2,1):
  205.                                 ligne = "%s%s%s%s%s" % ("SELECT PRENOM_ORIGINE,NOM_ORIGINE,DATE_NAISSANCE_ORIGINE,PRENOM_DESTINATION,NOM_DESTINATION,DATE_NAISSANCE_DESTINATION,TYPE_DE_RELATION FROM RELATION WHERE \
  206.                                                         UPPER(PRENOM_ORIGINE) LIKE '",Prenom_Origine.upper(), "%' AND UPPER(NOM_ORIGINE) LIKE '",Nom_Origine.upper(), "%'" )
  207.                                 lancesql(ligne)
  208.                                 conn.commit()
  209.                                 records = cursor.fetchall()
  210.                                 for row3 in records:
  211.                                     print(Nom_Origine,Prenom_Origine,'=>',row3[6],'=>',row3[4],row3[3])
  212.                                     ### recherche des liens dans la BDD
  213.                                     ligne = "%s%s%s%s%s" % ("SELECT PRENOM_ORIGINE,NOM_ORIGINE,DATE_NAISSANCE_ORIGINE,PRENOM_DESTINATION,NOM_DESTINATION,DATE_NAISSANCE_DESTINATION,TYPE_DE_RELATION FROM RELATION WHERE \
  214.                                                         UPPER(PRENOM_ORIGINE) LIKE '",Prenom_Origine.upper(), "%' AND UPPER(NOM_ORIGINE) LIKE '",Nom_Origine.upper(), "%'" )
  215.                                     lancesql(ligne)
  216.                                     CoordX=[]
  217.                                     CoordY=[]
  218.                                     for row4 in records:
  219.                                         painter.setPen(QColor(0, 0, 0, 225))
  220.                                         painter.setFont(QFont("Arial", 12))
  221.                                         texte = "%s %s" % (Nom_Origine.upper(),Prenom_Origine.capitalize())
  222.                                         painter.drawText(center[0],center[1],texte)
  223.                                         print("==>origine:",center[0],center[1],texte)
  224.                                         xC = int(center[0] + 250*math.cos((40/(len(records)+1))*compte_2))
  225.                                         yC = int(center[1] + 250*math.sin((40/(len(records)+1)*compte_2)))
  226.                                         CoordX.append(xC)
  227.                                         CoordY.append(yC)
  228.                                         painter.drawLine(center[0],center[1],xC,yC)
  229.                                         painter.setPen(QColor(0, 0, 0, 225))
  230.                                         painter.setFont(QFont("Arial", 12))
  231.                                         texte = "%s %s" % (row4[4].upper(),row4[3].capitalize())
  232.                                         painter.drawText(xC,yC,texte)
  233.                                    
  234.         print("fin painter" )
  235.         painter.end()
  236. if __name__ == '__main__':
  237.     app = QtWidgets.QApplication(sys.argv)
  238.     w = ClassWidget()
  239.     w.show()
  240.     sys.exit(app.exec())


---------------
https://www.oise-net-multiservices.com
n°2521469
rat de com​bat
attention rongeur méchant!
Posté le 01-04-2026 à 19:01:05  profilanswer
 

Si tu veux que des gens t'aident il faudrait peut-être (enfin!) que tu prenne en compte les remarques faites. Ton code est toujours vulnérable aux injections SQL, tu mélanges toujours tout ensemble (traitement/SQL/GUI/...). Par ailleurs, mais ça se discute, généralement on utilise l'anglais pour les noms de variables/fonctions/... Et vu la quantité de questions que tu poses je dirais achète enfin un bon LIVRE pour apprendre le Python plutôt que de tâtonner tout le temps (et ouvrir des sujets).


---------------
-/-
n°2521497
erwan83
Du Shift DEL tu te méfieras !
Posté le 01-04-2026 à 23:01:21  profilanswer
 

rat de combat a écrit :

Si tu veux que des gens t'aident il faudrait peut-être (enfin!) que tu prenne en compte les remarques faites. Ton code est toujours vulnérable aux injections SQL, tu mélanges toujours tout ensemble (traitement/SQL/GUI/...). Par ailleurs, mais ça se discute, généralement on utilise l'anglais pour les noms de variables/fonctions/... Et vu la quantité de questions que tu poses je dirais achète enfin un bon LIVRE pour apprendre le Python plutôt que de tâtonner tout le temps (et ouvrir des sujets).


 
 
Merci de ta réponse je suis vachement avancé maintenant


---------------
https://www.oise-net-multiservices.com
n°2521528
rat de com​bat
attention rongeur méchant!
Posté le 02-04-2026 à 15:42:28  profilanswer
 

Oulà, attention au ton, c'est toi qui demande de l'aide et pas qu'un peu et pas de manière super-claire en plus!


---------------
-/-
n°2521547
erwan83
Du Shift DEL tu te méfieras !
Posté le 02-04-2026 à 19:08:18  profilanswer
 

Bon je fais de mon mieux pour le code
 
Pour les injections SQL, je fais au plus simple pour le moment, je n'en suis pas encore au niveau de la sécurité
 
Mon seul problème est le suivant :
 

Code :
  1. ### TROISIEME BLOC
  2. class TROISIEME_BLOC(QtWidgets.QWidget):
  3.     def __init__(self, parent=None):
  4.         super(TROISIEME_BLOC, self).__init__(parent)
  5.         V_BOX1 = QtWidgets.QVBoxLayout(self)
  6.         self.H_BOX4 = QtWidgets.QHBoxLayout()
  7.         self.BTN_RECHERCHER_LIENS = QtWidgets.QPushButton('Rechercher',self)
  8.         self.BTN_RECHERCHER_LIENS.clicked.connect(self.RECHERCHER_LIENS)
  9.         self.H_BOX4.addWidget(self.BTN_RECHERCHER_LIENS)
  10.         TROISIEME_BLOC.label = QtWidgets.QLabel()
  11.         canvas = QtGui.QPixmap(1600,1600)
  12.         canvas.fill(QColor("white" ))
  13.         TROISIEME_BLOC.label.setPixmap(canvas)
  14.         V_BOX1.addWidget(self.BTN_RECHERCHER_LIENS)
  15.         V_BOX1.addWidget(self.label)
  16.         TROISIEME_BLOC.label.setPixmap(canvas)
  17.  
  18.     def RECHERCHER_LIENS(self):
  19.         Prenom_frappe = ....
  20.         Nom_frappe = ....
  21.         Date_Naissance_frappe = ....
  22.         ### PREMIERE BOUCLE : RECHERCHE DES RELATIONS
  23.         ligne = "%s%s%s%s%s" % ("SELECT .... FROM .... WHERE ...." )
  24.         lancesql(ligne)
  25.         conn.commit()
  26.         records = cursor.fetchall()
  27.      
  28.         compte = 0
  29.         Nom_Destination =[]
  30.         Prenom_Destination =[]
  31.         Relation =[]
  32.              
  33.         for row1 in records:
  34.             compte = compte+1
  35.             Nom_Destination.append(row1[4])
  36.             Prenom_Destination.append(row1[3])
  37.             Relation.append(row1[6])
  38.         canvas = QtGui.QPixmap(1600,1600)
  39.         canvas.fill(QColor("white" ))
  40.         self.label.setPixmap(canvas)
  41.         canvas = self.label.pixmap()
  42.         painter = QtGui.QPainter(canvas)
  43.         if compte > 0:         
  44.             texte = "%s %s" % (Nom_frappe.upper(),Prenom_frappe.capitalize())
  45.             painter.drawText(750,800,texte)
  46.             ### etc etc etc


 
Au départ la class TROISIEME_BLOC était dédiée uniquement au dessin mais j'ai commis une erreur et je n'arrive plus à afficher quoi que ce soit
Déjà je répète la création du QPixmap entre le début de la CLASS et la FONCTION...
Donc j'ai un truc qui merde entre début de la CLASS et la FONCTION au niveau du dessin mais je ne trouve pas quoi, vu que painter.draw n'affiche rien mais aussi que je n'ai aucun retour d'erreur !


---------------
https://www.oise-net-multiservices.com
mood
Publicité
Posté le 02-04-2026 à 19:08:18  profilanswer
 

n°2521549
boutlatent
Posté le 02-04-2026 à 19:39:10  profilanswer
 

Citation :

Code :
  1. TROISIEME_BLOC.label = QtWidgets.QLabel()
  2. canvas = QtGui.QPixmap(1600,1600)
  3. canvas.fill(QColor("white" ))
  4. TROISIEME_BLOC.label.setPixmap(canvas)



 
Pourquoi tu assignes ton label à ta classe et non à ton objet ?
 
Donc :

Code :
  1. label = QtWidgets.QLabel()
  2. self.canvas = QtGui.QPixmap(1600,1600)
  3. self.canvas.fill(QColor("white" ))
  4. label.setPixmap(canvas)


 
Faisant que de ces lignes
 

Citation :

Code :
  1. canvas = QtGui.QPixmap(1600,1600)
  2. canvas.fill(QColor("white" ))
  3. self.label.setPixmap(canvas)
  4. canvas = self.label.pixmap()
  5. painter = QtGui.QPainter(canvas)



 
Il n'en restera uniquement que
 

Code :
  1. painter = QtGui.QPainter(self.canvas)


Message édité par boutlatent le 02-04-2026 à 19:40:42

---------------
La connerie est la décontraction de l'intelligence.
n°2521551
mechkurt
Posté le 02-04-2026 à 19:45:50  profilanswer
 

Analyse des problèmes dans ton code (PyQt + PostgreSQL)
 
Je t’ai ChatGPT t'a fait un retour structuré sur les principaux points bloquants et erreurs dans ton code. Il y a à la fois des erreurs de syntaxe, des problèmes d’architecture et quelques mauvaises pratiques.
 
1. Erreur de syntaxe (bloquante)
 
* Parenthèse en trop :
 

Code :
  1. self.PRENOM_Label = QtWidgets.QLabel('Prénom :'))')


 
Cet élément empêche immédiatement l’exécution.
 
---
 
2. Mélange PyQt6 / PySide6
 
Tu importes à la fois PyQt6 et PySide6 :

Code :
  1. from PyQt6.QtWidgets import ...
  2. from PySide6.QtCore import ...


 
Ces deux frameworks ne doivent jamais être mélangés. Il faut en choisir un seul (idéalement PyQt6 ici).
 
---
 
3. Variables non définies
 
Dans RECHERCHER_LIENS :

Code :
  1. Prenom_frappe = PREMIER_BLOC.click_NOM_Input(Prenom_frappe)


 
* La variable n’existe pas
* Tu appelles une méthode de classe sans instance
 
Cela provoque un crash immédiat.
 
---
 
4. Mauvaise communication entre les widgets
 
TROISIEME_BLOC essaie d’accéder aux données de PREMIER_BLOC sans y avoir accès.
 
Il faut passer une instance du premier bloc au troisième :

Code :
  1. def **init**(self, premier_bloc):
  2. self.premier_bloc = premier_bloc


 
Puis accéder aux champs :

Code :
  1. Nom = self.premier_bloc.NOM_Input.text()


 
---
 
5. Classe principale manquante
 
Tu fais :

Code :
  1. w = ClassWidget()


 
Mais cette classe n’est jamais définie. Il faut une fenêtre principale qui instancie et assemble les blocs.
 
---
 
6. Problèmes SQL importants
 
* Construction de requêtes par concaténation :
 

Code :
  1. "SELECT ... LIKE '" + Nom_frappe + "%'"


 
=> vulnérable aux injections SQL
 
* cursor, conn, lancesql non définis
* conn.commit() inutile après un SELECT
 
Utiliser des requêtes paramétrées avec psycopg2 est fortement recommandé.
 
---
 
7. Problèmes avec QPainter
 
* Multiples redéfinitions de canvas
* Risque d’oublier painter.end()
* Gestion fragile du pixmap
 
Cela peut empêcher l’affichage ou provoquer des comportements instables.
 
---
 
8. Boucles et variables
 
* Réutilisation de la variable index dans des boucles imbriquées
* Utilisation de variables hors boucle (row2)
* Conditions incorrectes :
 

Code :
  1. if compte_2 > -1:


  (toujours vrai)
 
---
 
9. Problèmes mathématiques
 
Calcul des angles incorrect :

Code :
  1. math.cos((40/(len(...)))*index)


 
Les fonctions trigonométriques utilisent des radians. Il faut utiliser 2*pi pour un cercle complet.
 
---
 
10. Signaux Qt mal utilisés
 

Code :
  1. textChanged.connect(self.click_NOM_Input)


 
La fonction ne prend pas le paramètre attendu. Il faut adapter la signature ou utiliser un lambda.
 
---
 
Conclusion
 
Les principaux blocages viennent de :
 
* erreurs de syntaxe
* mélange de frameworks Qt
* absence d’architecture claire entre les widgets
* mauvaise gestion des variables et des appels de méthodes
* SQL non sécurisé
 
Avant d’aller plus loin, il est conseillé de :
 
1. Corriger les erreurs bloquantes
2. Faire fonctionner une version minimale de l’interface
3. Structurer correctement les interactions entre les composants
4. Sécuriser les accès base de données
 
Ensuite seulement, revenir sur la partie dessin et logique métier.


---------------
D3
n°2521555
rat de com​bat
attention rongeur méchant!
Posté le 02-04-2026 à 20:05:24  profilanswer
 

erwan83 a écrit :

Pour les injections SQL, je fais au plus simple pour le moment, je n'en suis pas encore au niveau de la sécurité

TRÈS dangereux comme méthode de dire "Je fais d'abord un truc qui tombe en marche et je met au propre/sécurise ensuite"! Malheureusement c'est commun comme méthode, mais je déconseille vivement, car le risque de ne jamais mettre au propre/sécuriser est réel (pour raison X ou Y). Tu devrais y aller par petits pas et petits bouts:
-apprendre les bases du Python3 avec un livre ou un BON tuto
-apprendre comment (avec quelle lib/...) faire des requêtes SQL correctement
-apprendre comment (idem) faire une interface graphique
-...
 
En voulant tout faire d'un coup tu n'auras jamais quelque chose de correct. Oui, ce que je dis est frustrant, mais il faut du temps et du travail pour (apprendre à) coder correctement, tout dév le confirmera. Et ne pars pas sur les "IA" et autres cochonneries, ça peut aider à première vue mais c'est pas top à divers niveaux, loin de la (conso énergétique/ressources, risque d'erreurs/bugs/failles, on apprend plus rien en l'utilisant, ...).


---------------
-/-
n°2521561
erwan83
Du Shift DEL tu te méfieras !
Posté le 02-04-2026 à 22:32:50  profilanswer
 

mechkurt a écrit :

Analyse des problèmes dans ton code (PyQt + PostgreSQL)
 
... /// ...
La fonction ne prend pas le paramètre attendu. Il faut adapter la signature ou utiliser un lambda.
 
---
 
Conclusion
 
Les principaux blocages viennent de :
 
* erreurs de syntaxe
* mélange de frameworks Qt
* absence d’architecture claire entre les widgets
* mauvaise gestion des variables et des appels de méthodes
* SQL non sécurisé
 
Avant d’aller plus loin, il est conseillé de :
 
1. Corriger les erreurs bloquantes
2. Faire fonctionner une version minimale de l’interface
3. Structurer correctement les interactions entre les composants
4. Sécuriser les accès base de données
 
Ensuite seulement, revenir sur la partie dessin et logique métier.


 
 
Merci beaucoup !!
Oui y'a du boulot !!


---------------
https://www.oise-net-multiservices.com
n°2521563
erwan83
Du Shift DEL tu te méfieras !
Posté le 02-04-2026 à 22:46:36  profilanswer
 

erwan83 a écrit :


 
J'ai viré PySide :

Code :
  1. import psycopg2
  2. import sys
  3. import math
  4. from PyQt6.QtWidgets import QApplication, QPushButton, QWidget, QLineEdit,QDialog, QLabel, QCalendarWidget,QMessageBox,QComboBox,QVBoxLayout,QHBoxLayout,QGridLayout,QLayout
  5. from PyQt6.QtGui import QBrush, QPainter, QPen, QPixmap, QColor,QFont
  6. from PyQt6 import QtWidgets, QtCore, QtGui


 
QPixmap:
=> j'ai trouvé le bug ça s'affiche

Code :
  1. setPixmap(canvas)


 
fonction lancesql :

Code :
  1. def lancesql(ligne):
  2.     #print(ligne)
  3.     #print('')
  4.     try:
  5.         cursor.execute(ligne)
  6.     except Exception as err:
  7.         print(f"{err=}, {type(err)=}" )
  8.     except:
  9.         print("autre erreur lors de LANCESQL" )


 
--  
pour l'erreur de parenthèse c'est quand j'ai supprimé des lignes en simplifiant le code ici lors du copier coller
 
--
* Multiples redéfinitions de canvas
* Risque d’oublier painter.end()
* Gestion fragile du pixmap
 
--
Chat J'ai pété ?
Pas trop mon truc vu le niveau moyen d'internet
 
--
injections SQL
J'en suis pas encore là, pour le moment c'est en DEV (LOL)
 
 
 
Merci beaucoup !!
Oui y'a du boulot !!



---------------
https://www.oise-net-multiservices.com
n°2521584
mechkurt
Posté le 03-04-2026 à 12:18:35  profilanswer
 

De nos jours apprendre à coder sans savoir se servir d'internet c'est un peu comme vouloir être forgeron sans maitriser le feu... :o  
 
Tu peux te créer un compte gratuit à n'importe quel LLM (copilot en installant vscode, ou en copiant collant ton code dans chatgpt ou gemini), il seront bcps plus patient que nous pour te répondre mais les conseils de base que d'autres t'ont donné plus haut reste primordiaux, lire les documentations, faire des tutos, apprendre à débuger, etc...


---------------
D3
n°2521593
rat de com​bat
attention rongeur méchant!
Posté le 03-04-2026 à 13:42:50  profilanswer
 

mechkurt a écrit :

De nos jours apprendre à coder sans savoir se servir d'internet c'est un peu comme vouloir être forgeron sans maitriser le feu... :o

Bien sûr, mais perso je fais une grosse différence entre "internet" (moteur de recherche, Stackoverflow, ...) et "IA"... Il  FAUT chercher sur internet si on ne trouves pas de solution, surtout avant de venir poster, mais perso je refuse de toucher à ces cochonneries d'"IA".


---------------
-/-
n°2521597
mechkurt
Posté le 03-04-2026 à 13:55:42  profilanswer
 

<hors-sujet>
Arrêter d’appeler des LLM de l'IA.
Pour moi on parlera d'IA quand il y'en aura une conscience, de la créativité, un esprit critique, tout ce dont les LLM actuel sont dépourvus.
C'est un super outil pour finir nos phrases et donc développer du code à notre place mais pour le moment ils n'ont aucun esprit critique.
C'est un peu détournée en démultipliant les LLM qui se surveillent eux même mais ça reste des probabilités statistique de trouver une vérité, pas une compréhension de celle-ci.
D’où les hallucinations parfois...
</hors-sujet>
 
Perso je ne connais pas Python, mais si je devais m'y mettre je ferais debugger mon code pas un LLM avant de poser une question ici, pacque c'est un bon outils pour ça quand on n'y connait pas grand chose car il est patient et disponible.
Par contre je penses que ça ne suffit pas pour devenir un bon développeur, il faut comprendre ce qu'il faut faire pour bien le "prompter" donc connaitre un minimum le sujet.


---------------
D3
n°2521598
rat de com​bat
attention rongeur méchant!
Posté le 03-04-2026 à 13:58:07  profilanswer
 

mechkurt a écrit :

Arrêter d’appeler des LLM de l'IA.

Je fais comme tout le monde, mais avec des guillemets pour des bonnes raisons (que tu évoques). :o  
 
Bref, perso les IA LLM c'est non.


---------------
-/-

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Python : récupérer données inter class ??

 

Sujets relatifs
[quasi résolu ;)]Meilleure méthode pour envoi de données ?récupérer d'une traite les commentaires des sites d'actu?
Bases de données HS : Trop d'utilisateurs ?Stocker fichiers Excel en base de données
Créer une class qui implemente une DispInterfaceExcel macro/vba récupérer données wikipedia (voir p.4)
Récupérer les données d'une page web[PowerShell]Récupérer la disposition clavier active (résolu)
Plus de sujets relatifs à : Python : récupérer données inter class ??


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)