Python: RuntimeError: super-classe de __init__() de %S n'a jamais été appelé
J'ai essayé de faire une opération (setParent
) sur un objet en Python (une instance d'une classe qui hérite d'une autre classe - pour être précis, QtGui.QLabel
), mais au cours de l'exécution d'erreur ci-dessus a été soulevée. L'objet lui-même a eu quelques champs avec le contenu réel (vérifié sur debug), mais à partir d'une raison que je ne pouvais pas "utiliser". Quelle est l'erreur et comment puis-je résoudre ce problème? Pour des informations supplémentaires, je dirais que l'objet a été renvoyé à partir d'une méthode statique avant j'ai essayé de faire cette opération.
La sous-classe a un __init__()
fonction de ses propres:
def __init__(self, image, father):
super(AtomicFactory.Image, self).__init__(father)
self.raw_attributes = image.attributes
self.attributes = {}
father.addChild(self)
self.update()
Maintenant, j'ai écrit un code similaire, simple, qui a eu le même message d'erreur sur la ligne widget.setParent(mw)
lorsque la fenêtre a été déplacé.
#!/usr/bin/env python
import sys
import copy
from PyQt4 import QtCore, QtGui
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main_widget=QtGui.QWidget()
widget = QtGui.QPushButton('Test')
widget.resize(640, 480)
widget.setParent(main_widget)
widget.move(0, 0)
widget2=QtGui.QPushButton('Test2')
widget2.i=0
widget2.resize(600, 200)
widget2.setParent(main_widget)
widget2.move(640, 0)
def onResize(event):
print event
mw=copy.deepcopy(main_widget)
widget.setParent(mw)
widget2.setParent(mw)
widget.move(0, 0)
widget2.move(640, 480)
main_widget_width=main_widget.width()
widget_width=widget.width()
width2=main_widget_width-widget_width
height2=widget2.height()
widget2.resize(width2, height2)
widget2.move(640, 0)
main_widget.resizeEvent=onResize
def onClick():
size=(widget2.width(), widget2.height())
if(widget2.i%2==0):
widget2.resize(int(size[0]/2), int(size[1]/2))
else:
widget2.resize(size[0]*2, size[1]*2)
widget2.i+=1
QtCore.QObject.connect(widget, QtCore.SIGNAL('clicked()'), onClick)
main_widget.show()
sys.exit(app.exec_())
Quel était le problème?
MyDerived
a son propre __init__
essayez d'ajouter la ligne super(MyDerived, self).__init__()
.Il n'. L'objet a été effectivement créé avant et a été utilisé amende. J'aurais également pu utiliser setParent() sans problèmes dans la phase initiale. Il a ensuite été inséré dans une liste et de la méthode statique que j'ai décrit ci-dessus "trouvé" dans la liste, puis renvoyé à une autre méthode statique. Lorsque ce dernier a essayé d'utiliser setParnet() sur celui-ci, l'erreur a été renvoyée. De toute façon, le __init__() fonction personnalisée de la sous-classe est:
def __init__(self, image, père): super(AtomicFactory.Image, self).__init__(père) de soi.raw_attributes = image.les attributs de l'auto.attributes = {} père.addChild(self) self.mise à jour()
Pieters Merci, en fait
Qu'est-ce que votre sous-classe? Est-il
AtomicFactory.Image
, ou quelque chose d'autre?
OriginalL'auteur Tomer | 2012-09-05
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez hériter
QObject
(ouQWidget
), vous devez toujours faire appel à la super-classe__init__
:Vous pouvez également appeler les parents de la classe
__init__
après quelques instructions, mais vous ne pouvez pas appelerQObject
méthodes ou de l'utilisationQObject
attributs jusqu'à ce que vous l'avez fait.Modifier:
Dans votre cas, vous essayez de
deepcopy
unQWidget
, mais c'est pas possible.Python peut être en mesure de copier le wrapper de la
QWidget
, mais leQWidget
lui-même est un objet C++ que python ne peut pas traiter avec la valeur par défaut de mise en œuvre decopy.deepcopy
, donc chaque fois que vous appelez une méthode de la copie d'un exemple vous obtenez leRuntimeError
parce que le sous-jacent C++ objet n'a pas été initialisé correctement.La même chose est vraie pour le décapage de ces objets. Python est capable de pickle la wrapper, pas le C++ objet lui-même, c'est pourquoi, lorsque unpickling l'instance le résultat est une instance endommagée.
Afin de soutenir
deepcopy()
laQWidget
classe doit implémenter l'__deepcopy__
méthode, mais il ne pas le faire.Si vous souhaitez copier les widgets, vous aurez à mettre en œuvre par vous-même tout le mécanisme à la main.
OriginalL'auteur Bakuriu