2016-12-07 5 views
0

Voici le programme:NameError dans le gestionnaire de signaux

import sys 
from PyQt4 import QtGui, QtCore 

class Example(QtGui.QWidget): 

    def __init__(self): 
     super(Example, self).__init__()   
     self.initUI() 

    def initUI(self): 

     self.setGeometry(400, 250, 680, 400) 
     self.setWindowTitle('Programme') 

     texte = QtGui.QLabel('On connait :', self) 
     texte.move(30, 50) 

     i = QtGui.QCheckBox("i", self) 
     i.move(30, 70) 
     i.setToolTip("C'est l'angle d'incidence de l'onde.") 
     i.stateChanged.connect(self.icoche) 

     n1 = QtGui.QCheckBox("n1", self) 
     n1.move(30, 90) 
     n1.setToolTip("C'est l'indice de réfraction du premier milieu. Il correspond au quotient de la vitesse de la lumière dans ce milieu et de la célérité.") 
     r = QtGui.QCheckBox("r", self) 
     r.move(30, 110) 
     r.setToolTip("C'est l'angle de réfraction de l'onde.") 
     n2 = QtGui.QCheckBox("n2", self) 
     n2.move(30, 130) 
     n2.setToolTip("C'est l'indice de réfraction du second milieu. Il correspond au quotient de la vitesse de la lumière dans ce milieu et de la célérité.") 

     algo = QtGui.QPushButton("Calculer", self) 
     algo.resize(algo.sizeHint()) 
     algo.move(30, 160) 
     algo.setEnabled(False) 

     vali = QtGui.QLineEdit(self) 
     vali.move(70, 70) 
     vali.setEnabled(False) 

     self.show() 

    def icoche(self, state): 

     if state == QtCore.Qt.Checked: 
      vali.setEnabled(True) 
     else : 
      vali.setEnabled(False) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

Mais quand je coche la case i, il renvoie l'erreur suivante:

NameError: global name 'vali' is not defined

J'ai essayé self.vali au lieu de vali, mais il n » t changer quoi que ce soit. Où est l'erreur?

+0

Veuillez lire un tutoriel de base python sur la façon d'utiliser les attributs dans les classes. – ekhumoro

Répondre

2

Vous devez utiliser self dans la classe pour l'utiliser comme attribut de classe. La façon dont vous l'avez eu c'était seulement dans la portée pour chaque fonction individuellement pas tous les deux.

self.vali = QtGui.QLineEdit(self) 
    self.vali.move(70, 70) 
    self.vali.setEnabled(False) 

    self.show() 

def icoche(self, state): 

    if state == QtCore.Qt.Checked: 
     self.vali.setEnabled(True) 
    else: 
     self.vali.setEnabled(False) 
0

Si la réponse ci-dessus ne vous a pas aidé. Tout ce que je peux voir dans ce code, c'est le problème d'indentation. Vos fonctions ne sont pas correctement indentées avec votre classe. Il vous manque un "tab" à tout votre code après le class Example(QtGui.QWidget): Avec cela, chaque self dans les fonctions est reconnu par une seule fonction seulement

+0

C'était juste un problème de formatage de code dans la question, qui a maintenant été corrigé. – ekhumoro