Python: RuntimeError: super-class __init __ () de% S nunca se llamó

Intenté realizar alguna operación ( setParent ) en un objeto en Python (una instancia de una clase que hereda de una clase diferente, para ser específico, QtGui.QLabel ), pero durante el tiempo de ejecución se produjo el error anterior. El objeto en sí ha tenido algunos campos con contenido real (verificado en la depuración), pero por alguna razón no pude “usarlo”. ¿Qué significa el error y cómo puedo solucionarlo? Para obtener información adicional, debo decir que el objeto se devolvió desde un método estático antes de intentar realizar esta operación en él.

La subclase tiene una función __init__() propia:

 def __init__(self, image, father): super(AtomicFactory.Image, self).__init__(father) self.raw_attributes = image.attributes self.attributes = {} father.addChild(self) self.update() 

Ahora escribí un código similar, uno simple, que tenía el mismo error en la línea widget.setParent(mw) cuando se movió la ventana.

 #!/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_()) 

¿Cual fue el problema?

Si desea heredar QObject (o QWidget ), siempre debe llamar a la __init__ :

 class MyObject(QObject): def __init__(self, *args, **kwargs): super(MyObject, self).__init__(arguments to parent class) #other stuff here 

También puede llamar al __init__ la clase de los __init__ después de algunas instrucciones, pero no puede llamar a los métodos QObject ni usar los atributos de QObject hasta que lo haya hecho.


Edit : En su caso, está intentando deepcopy una QWidget en deepcopy un QWidget , pero esto no es posible. Python puede copiar el envoltorio del QWidget , pero el QWidget sí mismo es un objeto C ++ que Python no puede manejar con la implementación predeterminada de copy.deepcopy , por lo tanto, cada vez que llama a un método de la instancia copiada, obtiene el RuntimeError porque el subyacente El objeto C ++ no se inicializó correctamente.

Lo mismo ocurre con el decapado de estos objetos. Python es capaz de encurtir el envoltorio , no el objeto C ++ en sí, por lo tanto, al descomprimir la instancia, el resultado es una instancia dañada.

Para admitir deepcopy() la clase QWidget debe implementar el método __deepcopy__ , pero no lo hace.

Si quieres copiar widgets tendrás que implementar por ti mismo todo el mecanismo a mano.