无法在 Python 中腌制 QLabel 对象
Can't Pickle QLabel object in Python
我正在尝试在 python 中使用 pickle 序列化 QLabel 子类,但是在取消 pickle 之后,文本似乎没有被设置。我做错了什么或者我应该怎么做才能使这项工作正常进行?
class TestClass(QLabel):
def __init__(self):
super().__init__()
self.setText("SomeText")
def __getstate__(self):
return self.__dict__.copy()
def __setstate__(self, state):
super().__init__()
self.__dict__.update(state)
tc = TestClass()
print(tc.text())
res = pickle.dumps(tc)
print(f"Dumps: {res}")
res = pickle.loads(res)
print(f"Loads: {res}")
print("unpickled text:", repr(res.text()))
输出:
SomeText
Dumps: b'\x80\x03ctestClass\nTestClass\nq\x00)\x81q\x01}q\x02b.'
Loads: <testClass.TestClass object at 0x0000027E64146048>
unpickled text: ''
我希望 unpickled 后的文本是相同的 "SomeText" 但事实并非如此。
你的 QLabel 的状态不是由你的 Python 对象的内部 __dict__
维护的,所以你必须显式地(反)序列化它:
class TestClass(QLabel):
def __init__(self):
super().__init__()
self.setText("SomeText")
def __getstate__(self):
return {
"__TEXT__": self.text()
}
def __setstate__(self, state):
super().__init__()
self.setText(state.get("__TEXT__", ""))
输出:
SomeText
Dumps: b'\x80\x03c__main__\nTestClass\nq\x00)\x81q\x01}q\x02X\x08\x00\x00\x00__TEXT__q\x03X\x08\x00\x00\x00SomeTextq\x04sb.'
Loads: <__main__.TestClass object at 0x7f18a90215f0>
unpickled text: 'SomeText'
我正在尝试在 python 中使用 pickle 序列化 QLabel 子类,但是在取消 pickle 之后,文本似乎没有被设置。我做错了什么或者我应该怎么做才能使这项工作正常进行?
class TestClass(QLabel):
def __init__(self):
super().__init__()
self.setText("SomeText")
def __getstate__(self):
return self.__dict__.copy()
def __setstate__(self, state):
super().__init__()
self.__dict__.update(state)
tc = TestClass()
print(tc.text())
res = pickle.dumps(tc)
print(f"Dumps: {res}")
res = pickle.loads(res)
print(f"Loads: {res}")
print("unpickled text:", repr(res.text()))
输出:
SomeText
Dumps: b'\x80\x03ctestClass\nTestClass\nq\x00)\x81q\x01}q\x02b.'
Loads: <testClass.TestClass object at 0x0000027E64146048>
unpickled text: ''
我希望 unpickled 后的文本是相同的 "SomeText" 但事实并非如此。
你的 QLabel 的状态不是由你的 Python 对象的内部 __dict__
维护的,所以你必须显式地(反)序列化它:
class TestClass(QLabel):
def __init__(self):
super().__init__()
self.setText("SomeText")
def __getstate__(self):
return {
"__TEXT__": self.text()
}
def __setstate__(self, state):
super().__init__()
self.setText(state.get("__TEXT__", ""))
输出:
SomeText
Dumps: b'\x80\x03c__main__\nTestClass\nq\x00)\x81q\x01}q\x02X\x08\x00\x00\x00__TEXT__q\x03X\x08\x00\x00\x00SomeTextq\x04sb.'
Loads: <__main__.TestClass object at 0x7f18a90215f0>
unpickled text: 'SomeText'