2014-04-06 16 views
5

Byłoby całkiem zabawne dowiedzieć się, dlaczego posiadanie instancji obiektu Qt jako atrybutu MyClass() powoduje dwustronicowy dziennik awarii. I jak go uniknąć:Python: Pickle and Qt (PyQT)

import sys, os, pickle 
from PyQt4 import QtGui 

class MyClass(object): 
    def __init__(self): 
     self.myQtWidget=QtGui.QPushButton() 
     pass 

app = QtGui.QApplication(sys.argv) 
myInstance=MyClass() 
pickle.dump(myInstance, open("save.mydata", "wb")) 
+1

Chciałbym wiedzieć, dlaczego trzeba wziąć pod uwagę instancję QWidget. Wydaje mi się, że jest to przypadek problemu xy (patrz http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Jeśli potrzebujesz rozwiązania, warto zadać nowe pytanie wyjaśniające, co próbujesz rozwiązać za pomocą rozwiązania wytrawiania (ponieważ, jak widać poniżej, wytrawianie nie zadziała) –

+1

@ three_pineapples. Uzgodniono, że Twoja ocena, chyba że OP nie musi naprawdę podnosić widżetów, a tylko inne rzeczy, które zawiera instancja klasy. Jeśli tak, mój komentarz jest rozwiązaniem. Mimo to wydaje się to być hackowskim obejściem tego, co jest prawdopodobnie wadliwym projektem. – ekhumoro

Odpowiedz

6

Z docs:

Poniższe klasy PyQt4 mogą być marynowane.

QByteArray 
QChar 
QColor 
QDate 
QDateTime 
QKeySequence 
QLatin1Char 
QLatin1String 
QLine 
QLineF 
QMatrix 
QPoint 
QPointF 
QPolygon 
QRect 
QRectF 
QSize 
QSizeF 
QString 
QTime 

Również wszystkie nazwane wyliczenia (na przykład QtCore.Qt.Key) mogą być marynowane.

+0

Więc nie możemy pobrać żadnych wystąpień klas z widżetami zdefiniowanymi jako ich attrs? Nie ma mowy? – alphanumeric

+2

@Sputnix. Możesz kontrolować, w jaki sposób trawienie odbywa się poprzez zdefiniowanie '__getstate__' i' __setstate__' dla twojej klasy. [Python docs dla tych metod] (https://docs.python.org/2/library/pickle.html#object.__getstate__) wyjaśnić dość wyraźnie, co musisz zrobić (w zasadzie, zwróć kopię instancji '__dict__ 'bez nieprzenikalnych bitów w' __getstate__' i przywracanie brakujących bitów w '__setstate__'). – ekhumoro

+0

Dzięki Ekhumoro! – alphanumeric

Powiązane problemy