2014-04-06 27 views
5

Nó sẽ khá thú vị để tìm lý do tại sao có một thể hiện của đối tượng Qt như là một thuộc tính của MyClass() gây ra một hai trang sụp đổ đăng nhập. Và làm thế nào để tránh nó:Python: Pickle và 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

Tôi muốn biết lý do bạn cần phải chọn một phiên bản của QWidget. Dường như với tôi như trường hợp của vấn đề xy (xem http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Nếu bạn cần một giải pháp, nó có thể là giá trị yêu cầu một câu hỏi mới giải thích những gì bạn đang cố gắng giải quyết với các giải pháp tẩy (vì như bạn có thể thấy dưới đây, tẩy sẽ không hoạt động) –

+1

@three_pineapples. Đồng ý về đánh giá của bạn, trừ khi OP không thực sự cần phải chọn các vật dụng, mà chỉ là những thứ khác mà cá thể lớp chứa. Nếu vậy, bình luận của tôi sẽ cung cấp một giải pháp. Nhưng ngay cả như vậy, điều này có vẻ như một cách giải quyết hackish cho những gì có thể là một thiết kế thiếu sót. – ekhumoro

Trả lời

6

Từ docs:

Các lớp PyQt4 sau đây có thể được ngâm.

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

Cũng có thể chọn tất cả các loại enums có tên (QtCore.Qt.Key ví dụ).

+0

Vì vậy, chúng tôi không thể chọn bất kỳ phiên bản lớp nào với các tiện ích được xác định là attrs của họ? Không có cách nào xung quanh? – alphanumeric

+2

@Sputnix. Bạn có thể kiểm soát cách thức tẩy được thực hiện bằng cách xác định '__getstate__' và' __setstate__' cho lớp của bạn. [Tài liệu python cho các phương thức này] (https://docs.python.org/2/library/pickle.html#object.__getstate__) giải thích khá rõ ràng những gì bạn cần làm (về cơ bản, trả về một bản sao của cá thể '__dict__ 'không có các bit không thể nhấp được trong' __getstate__', và khôi phục các bit còn thiếu trong '__setstate__'). – ekhumoro

+0

Cảm ơn Ekhumoro! – alphanumeric

Các vấn đề liên quan