2012-09-15 10 views
11

के बाद कोड QGraphicsView विजेट जो इसके अंदर एक QGraphicsScene होने पाठ का मालिक बनाना चाहिए:क्या यह पीईक्यूटी 4 पायथन बग है या गलत तरीके से व्यवहार कर रहा है?

#!/usr/bin/python 

import sys 
from PyQt4.QtGui import * 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 

    view = QGraphicsView() 
    scene = QGraphicsScene() 

    scene.addText("Hello!") 

    view.setScene(scene) 
    view.show(); 

    sys.exit(app.exec_()) 

इस विंडो खोलता है, पाठ डालता है वहाँ, लेकिन मैं खिड़की बंद करने के बाद - अजगर कोर उदासीनता और कई मुद्दों मुद्रित कर रहे हैं आउट:

(python:5387): Gtk-CRITICAL **: IA__gtk_container_add: assertion `GTK_IS_CONTAINER (container)' failed 

(python:5387): Gtk-CRITICAL **: IA__gtk_widget_realize: assertion `GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed 
...clip... 
... above message is shown many, many times ... 
...clip... 
(python:5387): Gtk-CRITICAL **: IA__gtk_widget_realize: assertion `GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed 
Segmentation fault (core dumped) 

संस्करण: python2.7 2.7.3-0ubuntu3.1 अजगर-QT4 4.9.1-2ubuntu1

उत्तर

10

शायद यह न तो एक पीईक्यूटी बग है, न ही गलत तरीके से व्यवहार कर रहा है।

जब पाइथन अपनी शटडाउन प्रक्रिया के माध्यम से जाता है, ऑर्डर जिसमें वस्तुओं को हटाया जाता है, अप्रत्याशित हो सकता है। कभी-कभी, इससे कुछ हद तक परेशान त्रुटि संदेश प्रकट हो सकते हैं।

आपकी स्क्रिप्ट मेरे (गैर उबंटू) Linux मशीन पर ठीक चलाता है - लेकिन जब मैं विंडो बंद कर दें, मैं इस उत्पादन प्राप्त करें:

$ python2 test.py 
QPixmap: Must construct a QApplication before a QPaintDevice 
Aborted 

कौन सा, अंकित मूल्य पर लिया, में कोई समझ बनाने के लिए लगता है सभी ...

हालांकि, ऑब्जेक्ट को अलग-अलग क्रम में हटाने के लिए मजबूर करना आमतौर पर ऐसे त्रुटि संदेशों से छुटकारा पाने में बहुत आसान होता है।

ऐसा करने के लिए एक (थोड़ा अजीब) तरीका केवल कुछ वस्तुओं का नाम बदलना है। तो मेरे लिए, त्रुटि संदेश गायब हो जाते हैं अगर मैं बस view_view बदलता हूं।

हालांकि, एक शायद बेहतर विकल्प लगता है कि कुछ महत्वपूर्ण वस्तुओं एक माता पिता/बच्चे पदानुक्रम में एक साथ जुड़े हुए हैं बनाने के लिए है:

view = QGraphicsView() 
    scene = QGraphicsScene(view) 

ऐसा करने के लिए कारण, यह है कि जब एक वस्तु deleteing, क्यूटी होगा अपने सभी वंशज QObject नोड्स को स्वचालित रूप से हटा दें। इससे यह सुनिश्चित करने में मदद मिल सकती है कि पीईक्यूटी ऑब्जेक्ट्स के सी ++ पक्ष को पायथन पक्ष से पहले साफ़ किया गया है (जो वास्तव में इन प्रकार की समस्याओं का कारण बनता है)। `App.deleteLater चाल()` किया जोड़ना

import sys 
from PyQt4.QtGui import * 

def main(): 
    view = QGraphicsView() 
    scene = QGraphicsScene() 
    scene.addText("Hello!") 
    view.setScene(scene) 
    view.show() 
    return qApp.exec_() 

if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    sys.exit(main()) 
+0

'दृश्य' के माता-पिता को' देखने 'बनाना इसे करने का सबसे अच्छा तरीका है, आईएमओ। ;-) – Peque

+0

एलओएल अच्छी तरह से किया गया, चीजों को एक अलग 'मुख्य()' विधि में ले जा रहा है और 'exec _()' को वापस करने से मेरा "segfault" – sjm324

13

यह टी लग रहा है o छोड़ने पर हटाए जाने वाले QAplication ऑब्जेक्ट से संबंधित हो, लेकिन मुझे यकीन नहीं है कि क्यों। आपके कोड ने विंडोज के तहत मेरे लिए ठीक काम किया है, लेकिन मुझे उबंटू इंस्टॉल के तहत एक ही सीजी गलती आउटपुट मिला है।

मैं निम्नलिखित कोड के साथ एक काम के रूप में एक साफ निकास पाने में कामयाब रहा।

#!/usr/bin/python 

import sys 
from PyQt4.QtGui import QApplication, QGraphicsView, QGraphicsScene 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 

    view = QGraphicsView() 
    scene = QGraphicsScene() 

    scene.addText("Hello!") 

    view.setScene(scene) 
    view.show() 

    app.exec_() 
    app.deleteLater() 
    sys.exit() 
+3

:

एक और संभावना QApplication करने के लिए एक वैश्विक संदर्भ रखने के लिए, और एक main समारोह में सब कुछ डाल करने के लिए है। धन्यवाद! – Onlyjus

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