python QT underlying object deleted when import code -


मेरे पास एक साधारण प्रोग्राम है जो QGraphicsScene / देखें बनाते हैं

मेरा उद्देश्य केवल कुछ फाइलों में दृश्य के कोड को परिभाषित करना है, कुछ सहायक फ़ुर्स के साथ, किसी फाइल को निष्पादित करना ( exec python के स्टेटमेंट के माध्यम से) पहले से ही परिभाषित किया।

मैं भी एक धागा जो कॉलबैक देने अपने मुख्य कार्यक्रम में है, और मैं कॉलबैक पर qgraphicsitems पर कुछ सामान करना चाहते हैं।

उदाहरण यहाँ से अदृश्य होने की एक एनीमेशन को परिभाषित अदर्शन वर्ग AnimInvisible की एक एनीमेशन के PySide आयात QtGui # परिभाषा से

 : एक कॉलबैक से जुड़ा हुआ डीईएफ़ __init __ (स्वयं, आइटम): self.item = आइटम डीईएफ़ on_callback (स्वयं, टैग): self.item.setVisible (tag.getProperty ()! = 0) एक सरल QGraphicsRectItem mon_rect = QtGui.QGraphicsRectItem (400, 300, 100, 50) mon_rect.setBrush (QtGui.QBrush (QtGui.QColor ( 'लाल' की # सृजन ))) # यह फ़ाइल में परिभाषित दृश्य को रीसेट जोड़ देगा # जहां exec कथन किया जाता है (exec द्वारा निर्यात किया जाता है) addItem (mon_rect) a = AnimInvisible (mon_rect) # यह धागा से कुछ परिवर्तनों पर a.on_callback कनेक्ट करता है। (एक्स्प्ले से निर्यात किया गया) ऐडकाल्बैक (ए। ओकॉलबैक, 'सिस्टम: सीएमडीएमजी')   

और यह बहुत अच्छी तरह से काम करता है। लेकिन अब, अगर मैं किसी अन्य मॉड्यूल में AnimInvisible का कोड डालता हूं - तो एनिमेशन कहते हैं - और मैं इसके बाद के संस्करण में प्रतिस्थापित करता हूं:

  एनिमेशन से आयात करें AnimInvisible   

मैं एक त्रुटि है, कह रही है कि आंतरिक सी ++ वस्तु (PySide.QtGui.QGraphicsRectItem) पहले से ही हटा ..

यह वास्तव में अजीब व्यवहार है कि मुझे समझ नहीं आता है। मैंने Py साइड के बजाय PyQt के साथ भी कोशिश की और मुझे एक ही व्यवहार (जब AnimInvisible का कोड एक मॉड्यूल में है, और कोई समस्या नहीं है अगर यह एक ही फाइल में है, तब वस्तु नष्ट हो जाती है)।

आपकी टिप्पणियों के लिए धन्यवाद एलेक्सिसम और वेरला, मुझे समस्या मिली।

मैं ऐसा कुछ कर रहा था यह:

  वर्ग समरूपता: def __init __ (स्वयं, डब्ल्यू, एच): self.view = QGraphicsView () self.scene = SynopScene () # कुछ प्रारंभिक ... def openSynop (buApp, fname, डब्ल्यू, ज): synop = Synoptique (डब्ल्यू, ज) var_export = { 'addItem': synop.addItem, 'addCallback': buApp.addCallback,} var_export synop.view.show में कार्यकारी खुला (fname) () करता है, तो __name__ == '__main__': एप्लिकेशन = QApplication (sys.argv) # buApp निर्माण openSynop (buApp, 'synop.py', 800, 600) app.exec_ ()   

लेकिन यह प्रकट होता है कि शोरोप ऑब्जेक्ट (QGraphicsView और दृश्य युक्त) का संदर्भ खो गया है, क्योंकि यह ओपनएसिनोप समारोह में एक स्थानीय चर है तो उस दृश्य में QGraphicsView, दृश्य, और ऑब्जेक्ट्स का संदर्भ भी खो दिया है।

इसे संभालने का एक तरीका फ़ंक्शन के बाहर समनुरूप उदाहरण को घोषित करना है, मुख्य कॉल में, या वापस लौटना और सहेजना समारोह से संक्षिप्त संदर्भ उदाहरण के लिए इसने मेरी समस्या का समाधान किया है:

  def openSynop (buApp, fname, w, h): # पहले के समान ... वापस लौटाएं यदि __name__ == '__main__': # जैसा भी पहले ... s = openSynop (buApp, 'synop.py', 800, 600) app.exec_ ()   

अब मैं समझता हूं कि मुझे QGraphicsView / scene पर एक संदर्भ रखना होगा बाद में QGraphicsItem जो दृश्य के अंदर है हेरफेर करने के लिए ... वाह यह मेरे लिए स्पष्ट नहीं था, धन्यवाद फिर से!

Comments