Signaler

Un débutant sur pyqt [Résolu]

Posez votre question Oliv - Dernière réponse le 22 mai 2017 à 20:29 par gudu
Bonjour,

j'ai une erreur sur la 31 de mon prog qui pourtant fonctionné très bien:

Traceback (most recent call last):
File "C:\Users\util10\Projet py\Liste de points\Liste_points.py", line 31, in on_pushButtonSuivant_clicked
self.textBrowser.append(objetchantier.NomChantier)
NameError: name 'objetchantier' is not defined

mon objet est crée à la construction de mon interface dans le def __init__
donc je ne comprend pas d’où vient le problème surtout que ce code marché parfaitement auparavant

Voici mon code:

# -*- coding: utf-8 -*-
# start_app.py
import sys
import bar
from PyQt5.QtWidgets import QMainWindow, QFileDialog, QMessageBox, QApplication
from PyQt5.QtCore import pyqtSlot
from Ui_MainWindowListePoints import *
from class_info_chantier import *

class MainWindowListePoints(QMainWindow, Ui_MainWindowListePoints):
def __init__(self,parent=None):
super(MainWindowListePoints,self).__init__(parent)
self.setupUi(self)

#On instancie un objet de la classe Infochantier à l'ouverture du programme
'''objetchantier = InfoChantier("Nom du chantier", "AF00-000",
"Nom du client", "Adresse du Chantier", "Status du documents",
"chemin image")'''

objetchantier = InfoChantier(self.lineEditNomChantier.text(), self.lineEditNumAffaire.text(),
self.lineEditNomClient.text(), self.lineEditAdresseChantier.text(), self.comboBox.currentText(),
"chemin image")

#On grise les QlineEdit et QdateEdit des Révisions non utiliser
self.lineEditRemarques1.setDisabled(1)
self.dateEditR1.setDisabled(1)


@pyqtSlot()
def on_pushButtonSuivant_clicked(self):

self.textBrowser.append(objetchantier.NomChantier)
self.textBrowser.append(objetchantier.NumrAffaire)
self.textBrowser.append(objetchantier.NomClient)
self.textBrowser.append(objetchantier.AdresseChantier)
self.textBrowser.append(objetchantier.Statut)

@pyqtSlot()
def on_action_Ouvrir_triggered(self):
(nomFichierListePoints,filtre) = QFileDialog.getOpenFileName(
self,"Ouvrir fichier Liste de Points",
filter="ListeDePoints (*.ldperp);; Tout (*.*)")
if nomFichierListePoints:
# TODO: trace temporaire à remplacer par la lecture du fichier
QMessageBox.information(self,"TRACE",
"Fichier à ouvrir:\n\n%s"%nomFichierListePoints)

@pyqtSlot()
def on_pushButtonCharger_clicked(self):
(nomFichierListePoints,filtre) = QFileDialog.getOpenFileName(
self,"Ouvrir fichier Liste de Points",
filter="ListeDePoints (*.ldperp);; Tout (*.*)")
if nomFichierListePoints:
# TODO: trace temporaire à remplacer par la lecture du fichier
QMessageBox.information(self,"TRACE",
"Fichier à ouvrir:\n\n%s"%nomFichierListePoints)

@pyqtSlot()
def on_pushButtonEnrengistrer_clicked(self):
# TODO: trace temporaire à remplacer par la lecture du fichier
self.textBrowser.append(str(self.spinBox.value()))

@pyqtSlot()
def on_pushButtonImageChantier_clicked(self):
(nomFichierImageChantier,filtre) = QFileDialog.getOpenFileName(
self,"Choisir une image",
filter="Image (*.jpeg);; Tout (*.*)")
if nomFichierImageChantier:
# TODO: trace temporaire à remplacer par la lecture du fichier
QMessageBox.information(self,"TRACE",
"Fichier à ouvrir:\n\n%s"%nomFichierImageChantier)

@pyqtSlot()
def on_actionA_Propos_triggered(self):
# TODO: Editer le a propos
texte_test=self.lineEditNomChantier.text()
self.lineEditNomClient.setText(texte_test)


@pyqtSlot()
def on_action_Quitter_triggered(self):
self.close()

def closeEvent(self,event):
messageConfirmation = "Êtes-vous sûr de vouloir quitter Liste de Points EREP ?"
reponse = QMessageBox.question(self,"Confirmation",
messageConfirmation,QMessageBox.Yes,QMessageBox.No)
if reponse == QMessageBox.Yes:
#TODO: Vérifier si enrengistrement fait?
event.accept()
else:
event.ignore()

#Edition des argument s de la class infochantier si modification
@pyqtSlot()
def on_lineEditNomChantier_editingFinished(self):
objetchantier.NomChantier = self.lineEditNomChantier.text()

@pyqtSlot()
def on_lineEditNumAffaire_editingFinished(self):
objetchantier.NumrAffaire = self.lineEditNumAffaire.text()

@pyqtSlot()
def on_lineEditNomClient_editingFinished(self):
objetchantier.NumClient = self.lineEditNomClient.text()

@pyqtSlot()
def on_lineEditAdresseChantier_editingFinished(self):
objetchantier.AdresseChantier = self.lineEditAdresseChantier.text()

@pyqtSlot()
def on_comboBox_activated(self):
#objetchantier.Statut = self.comboBox.
self.textBrowser.append(self.comboBox.currentText())

#implementation des objet pour les révisions
@pyqtSlot()
def on_checkBoxR1_stateChanged(self):
self.textBrowser.append("cocher moi cette merde chien")
self.lineEditRemarques1.setDisabled(0)
self.dateEditR1.setDisabled(0)




app = QApplication(sys.argv)
mainWindowListePoints = MainWindowListePoints()
mainWindowListePoints.show()
rc = app.exec_()
sys.exit(rc)


Si vous avez une idée et des explication que je comprend mon erreur.
Merci
Afficher la suite 
Utile
+1
plus moins
Pas bien réveillé ?

C'est self.objetchantier = blabla

Ainsi tu pourras y accéder dans toutes tes méthodes de ta classe en utilisant self.objetchantier.

Je pense quand même que t'étais pas bien réveillé ce matin car tu le fais bien pour les autres attributs de ta classe :D
Donnez votre avis
Utile
+0
plus moins
Merci de ta réponse mais quand je place self devant mon attribut j'ai l'erreur suivante:

self.objetchantier.NomChantier = self.lineEditNomChantier.text()
AttributeError: 'MainWindowListePoints' object has no attribute 'objetchantier'

objetchantier est un objet que j'instancie à la construction de la class MainWindowListePoints je devrais pourtant y avoir accès dans les méthodes de cette même classe non?
Donnez votre avis
Utile
+0
plus moins
Un simple test :

>>> class A :
...     def __init__(self):
...         self.a = 10
... 
>>> class B(A):
...     def __init__(self):
...         super(A, self).__init__()
...         print(self.a)
... 
>>> b = B()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in __init__
AttributeError: 'B' object has no attribute 'a'


Je ne connais pas trop les rouages de super() mais généralement super().__init__(self) suffit, python s'occupe très bien du mro tout seul.
Donnez votre avis
Utile
+0
plus moins
Bonjour,

Suite à différents essais il semble que si j'instancie un objet dans le constructeur d'un autre je ne peux pas accéder aux arguments de celui-ci
# -*- coding: utf-8 -*-
# Test des acces des attributs entre objet

class toto:
variable_a = "yes"
variable_b = 33
varibale_c = "Je sais pas j'apprend!!"

class bob:

def __int__(self):
blague = toto()
print("objet toto crée")

def testacces(self):
print(blague.variable_a)
print(blague.variable_b)
print(blague.varibale_c)


essai = bob()

# Là j'ai une erreur de définition pour blague!!
blague.variable_a
blague.varibale_c

essai.testacces()



en conséquence pour y accéder il faut déclarer son objet en dehors comme suit:
# -*- coding: utf-8 -*-
# Test des acces des attributs entre objet

class toto:
variable_a = "yes"
variable_b = 33
varibale_c = "Je sais pas j'apprend!!"

class bob:

def __int__(self):

print("objet de classe bob crée")

def testacces(self):
print(blague.variable_a)
print(blague.variable_b)
print(blague.varibale_c)


essai = bob()
blague = toto()
# Là j'ai une erreur de définition pour blague!!
blague.variable_a
blague.varibale_c

essai.testacces()


Donc problème résolut pour moi même si j'ai des choses à apprendre encore...
Merci Gudu pour tes réponse.
Donnez votre avis
Utile
+0
plus moins
Je pense que tu confonds variable de classe et variable d'instance.

Selon ton exemple, dans le cadre d'une composition :

class Toto:
	a = "yes"
	def __init__(self):
	    print("toto est là")

class Bob:
    def __init__(self):
        print("bob est là")
        self.toto = Toto() 

    def test(self):
        print("Variable d'instance self.toto.a", self.toto.a)
        print("Variable de classe Toto.a", Toto.a)

    def set_a(self, value):
        self.toto.a = value
        
bob = Bob()
bob.test()

bob.set_a("No")
bob.test()


Pour l"héritage, c'est identique, sauf que l'attribut a sera interne à la classe héritant de Toto.

class Toto:
	a = "yes"
	def __init__(self):
	    print("toto est là")

class Bob(Toto):
    def __init__(self):
        print("bob est là")
        super().__init__()

    def test(self):
        print("Variable d'instance self.a héritée de toto", self.a)
        print("Variable de classe Toto.a", Toto.a)

    def set_a(self, value):
        self.a = value
        
bob = Bob()
bob.test()

bob.set_a("No")
bob.test()
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !