2012-09-05 7 views
9

मैं कुछ आपरेशन (setParent) पायथन में एक वस्तु पर (एक वर्ग जो एक अलग वर्ग से विरासत का एक उदाहरण करने की कोशिश की QtGui.QLabel), लेकिन रनटाइम के दौरान उपर्युक्त त्रुटि उठाई गई थी। ऑब्जेक्ट में वास्तविक सामग्री (डीबग पर सत्यापित) के साथ कुछ फ़ील्ड हैं, लेकिन किसी कारण से मैं इसे "उपयोग" नहीं कर सका। त्रुटि का मतलब क्या है और मैं इसे कैसे ठीक कर सकता हूं? कुछ अतिरिक्त जानकारी के लिए, मैं कहूंगा कि इस ऑपरेशन को करने की कोशिश करने से पहले ऑब्जेक्ट को स्थैतिक विधि से वापस कर दिया गया था।पायथन: RuntimeError: -, विशिष्ट होना सुपर वर्ग __init __ (% S के) कहा कभी नहीं किया गया था

उपवर्ग की अपनी एक __init__() कार्य है:

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

अब मैं एक ऐसी ही कोड, एक साधारण एक है, कि लाइन widget.setParent(mw) पर एक ही त्रुटि थी जब खिड़की ले जाया गया था लिखा था।

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

समस्या क्या थी?

+0

यदि आपकी व्युत्पन्न कक्षा 'MyDerived' का अपना' __init__ 'है तो' सुपर (MyDerived, self) .__ init __() 'जोड़ने का प्रयास करें। – halex

+0

यह करता है। वस्तु वास्तव में पहले बनाई गई थी और ठीक इस्तेमाल किया गया था। मैं शुरुआती चरण में समस्याओं के बिना setParent() का भी उपयोग कर सकता था। इसे तब एक सूची में डाला गया था और मैंने वर्णित स्थिर विधि को सूची में "पाया", और फिर इसे किसी अन्य स्थिर विधि में वापस कर दिया। जब उत्तरार्द्ध ने setParnet() का उपयोग करने की कोशिश की, तो त्रुटि वापस कर दी गई। वैसे भी, उप-वर्ग का __init __() कस्टम फ़ंक्शन है: – Tomer

+0

def __init __ (स्वयं, छवि, पिता): सुपर (परमाणु फैक्ट्री.इमेज, स्वयं) .__ init __ (पिता) self.raw_attributes = image.attributes स्वयं।विशेषताएं = {} पिता.एड चाइल्ड (स्वयं) self.update() – Tomer

उत्तर

15

आप QObject (या QWidget) प्राप्त करना चाहते हैं, तो आप हमेशा सुपर वर्ग __init__ कॉल करना होगा:

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

तुम भी माता-पिता के वर्ग के __init__ कुछ निर्देश के बाद कह सकते हैं, लेकिन आप कॉल नहीं कर सकते QObject विधियों या QObject गुणों का उपयोग तब तक करें जब तक आप ऐसा नहीं करते।


संपादित: अपने मामले में आप deepcopy एक QWidget की कोशिश कर रहे हैं, लेकिन इस नहीं संभव है। अजगर आवरण QWidget की नकल करने में सक्षम हो सकता है, लेकिन QWidget ही है, एक सी ++ कि अजगर copy.deepcopy के डिफ़ॉल्ट कार्यान्वयन के साथ संभाल सकते हैं आपत्ति है इसलिए जब भी आप की नकल की उदाहरण की एक विधि फोन आपको मिल RuntimeError क्योंकि अंतर्निहित सी ++ ऑब्जेक्ट ठीक से शुरू नहीं किया गया था।

इन वस्तुओं को चुनने के लिए भी यही सच है। पाइथन रैपर को चुनने में सक्षम है, सी ++ ऑब्जेक्ट स्वयं नहीं, इसलिए जब उदाहरण को अनपिक करते हैं तो परिणाम दूषित उदाहरण होता है।

आदेश deepcopy()QWidget वर्ग __deepcopy__ विधि को लागू करना चाहिए का समर्थन करने के लिए, लेकिन यह नहीं कि क्या करता है।

यदि आप विजेट कॉपी करना चाहते हैं तो आपको अपने हाथ से सभी तंत्र को लागू करना होगा।

+0

कृपया ऊपर दिए गए मार्टिजन पीटर्स को मैंने जो उत्तर लिखा है उसे देखें। मुझे नहीं पता कि मेरे कोड को एक और स्पष्ट तरीके से कैसे साझा किया जाए ... – Tomer

संबंधित मुद्दे