2014-05-21 5 views
-2

Je suis essayer PySide, au début quand j'ai essayé d'utiliser:Quelle est la différence entre la classe() et la classe

t = test()

Il me donnerait: TypeError: trybutton() takes 2 positional arguments but 3 were given

mais par hasard, j'ai vu qu'il irait très bien si je l'ai fait à la place:

t = test

Alors je me demande comment ça peut être?

class test(): 

def trybutton(name, self): 
    return QPushButton(name, self) 

class main(QMainWindow): 

     def __init__(self, parent=None): 
      super(main, self).__init__(parent) 
      self.testui() 

     def testui(self): 
      main.set_button(self, "test", "testy") 

     def set_button(self, *names): 
      t = test 
      b = [t.trybutton(name, self) for name in names] 

if __name__ == "__main__": 
     app = QApplication(sys.argv) 
     frame = main() 
     frame.show() 
     app.exec_() 
+1

avec '()' vous initialisez une instance d'objet de classe 'test', alors que' t = test' est juste de réaffecter la classe 'test' à une variable locale' t'. Vous devez créer un objet instancd plus tard avec 't()' – karthikr

+3

'def trybutton (nom, self):' me semble bizarre. self est supposé être le premier argument d'une méthode, car elle est fournie automatiquement par Python. Cela explique aussi votre TypeError. 'trybutton' prend deux arguments, mais vous devez seulement en fournir un. – Kevin

Répondre

1

trybutton est une méthode de classe et ne doit pas être appelé à partir d'un objet instancié

Lorsqu'un objet instancié appelle une de ses méthodes, il s'envoie toujours comme premier argument donc quand vous faites t=test() et puis t.trybutton(a, b) la méthode elle-même recevra 3 paramètres (the_object, a, b) et ainsi l'erreur takes 2 positional arguments but 3 were given

0

Voyons ce qui se passe dans chaque cas.

# Assign the class test to the variable t 
t = test 
# Call the method on the class, passing in two arguments explicitly. 
b = [t.trybutton(name, self) for name in names] 


# Create an object of the class test and assign it to the variable t 
t = test() 
# Call the method on the class, passing in two arguments explicitly, and one argument implicitly 
# Note that the implicit argument is the argument t itself, which is passed as the first argument 
b = [t.trybutton(name, self) for name in names] 

C'est la raison pour laquelle vous obtenez une erreur au sujet de passer 3 arguments quand 2 sont attendus.


Voici une solution possible.

class test(): 
    def trybutton(self, name): 
     return QPushButton(name, self) 

t = test() 
# pass one argument explicitly, one implicitly. 
b = [t.trybutton(name) for name in names] 
+0

La première partie de votre réponse et le correctif contiennent toujours l'une des erreurs de l'OP, le mauvais ordre des arguments dans 'name, self'. –

+0

@lukasgraf, j'ai vérifié l'API et il semble que cette méthode soit dans cet ordre sauf si j'ai mal lu la documentation. – merlin2011

+0

@lukasgraf http://pyside.github.io/docs/pyside/PySide/QtGui/QPushButton.html – merlin2011

Questions connexes