HoW*_*Wil 5 python pickle python-3.x pyqt5
我尝试腌制 QPolygon 并随后加载它,但出现错误。我已经在 Python2 上使用 PyQt4 完成了此操作,但现在想在 Python3 上使用 PyQt5 使用它。
我不想读取/加载用 Python 2 生成的数据!pickle 文件仅用于临时存储 Qt 元素,例如从 Python3 到 Python3 的 QPolygon。
我已经为 pickle.dump() 测试了 1-4 不同的协议选项,并尝试使用“fix_imports=True”选项,该选项在 Python3 中不会产生影响。
这是我的简化代码
from PyQt5.QtGui import QPolygon
from PyQt5.QtCore import QPoint
import pickle
file_name = "test_pickle.chip"
with open(file_name, 'wb') as f:
poly = QPolygon((QPoint(1, 1), QPoint(2, 2)))
pickle.dump(poly, f, protocol=2) # , fix_imports=True)
# loading the data again
with open(file_name, 'rb') as f:
elem = pickle.load(f, encoding='bytes') # , fix_imports=True)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息,但无法对其执行任何操作:
Run Code Online (Sandbox Code Playgroud)elem = pickle.load(f, encoding='bytes') # , fix_imports=True) TypeError: index 0 has type 'int' but 'QPoint' is expected
除了泡菜还有什么替代品吗?提前致谢!
您可以使用QDataStream序列化/反序列化 Qt 对象:
from PyQt5 import QtCore
from PyQt5.QtGui import QPolygon
from PyQt5.QtCore import QPoint, QFile, QIODevice, QDataStream, QVariant
file_name = "test.dat"
output_file = QFile(file_name)
output_file.open(QIODevice.WriteOnly)
stream_out = QDataStream(output_file)
output_poly = QPolygon((QPoint(1, 6), QPoint(2, 6)))
output_str = QVariant('foo') # Use QVariant for QString
stream_out << output_poly << output_str
output_file.close()
input_file = QFile(file_name)
input_file.open(QIODevice.ReadOnly)
stream_in = QDataStream(input_file)
input_poly = QPolygon()
input_str = QVariant()
stream_in >> input_poly >> input_str
input_file.close()
print(str(output_str.value()))
print(str(input_str.value()))
Run Code Online (Sandbox Code Playgroud)