如何解决TypeError:使用莳萝库时无法腌制_tkinter.tkapp对象
所以,我有这样的课:
class Category:
def __init__(self,name):
self.bt = Button(t,text = name,command = lambda : opencategory(name))
self.packing()
def packing(self):
self.bt.pack(fill = X)
def pack_forg(self):
self.bt.pack_forget()
然后我创建“类别”对象列表,例如:
list_cat = [Category("a"),Category("b"),Category("c")]
我使用莳萝模块将该列表保存到文件中
if list_cat != []:
with open("file.pkl","wb") as f2:
dill.dump(list_cat,f2)
但是当我运行它时,它返回TypeError: can't pickle _tkinter.tkapp
我愿意接受使用JSON,泡菜,莳萝或其他任何方法的任何解决方案。
这是完整的工作代码:
from tkinter import *
import os.path
from os import path
import dill
t = Tk()
t.title("test7")
t.geometry("100x300")
a = 1
list_cat = []
if path.exists("test777.pkl"):
with open("test777.pkl","rb") as filee:
list_cat = dill.load(filee)
def opencategory(sampletext):
print(sampletext)
class Category:
def __init__(self,sampletext):
self.bt = Button(t,text = sampletext,command = lambda : opencategory(sampletext))
self.packing()
def packing(self):
self.bt.pack(fill = X)
def pack_forg(self):
self.bt.pack_forget()
def save_c():
if list_cat != []:
with open("test777.pkl","wb") as file:
dill.dump(list_cat,file)
def add_c():
global a
list_cat.append(Category(a))
a += 1
save = Button(t,text = "save",command = save_c)
save.pack(fill = X)
add = Button(t,text = "add",command = add_c)
add.pack(fill = X)
for i in list_cat:
i.packing()
解决方法
您正在尝试腌制对象列表。这些对象均包含一个小部件。您不能腌制小部件。根本做不到。
,我是dill
的作者。我同意@Bryan_Oakley。但更明确地说,_tkinter
不是python(我相信它是C ++)。问题是,除非位于其上方的python类提供了序列化指令(如numpy
数组那样),否则任何python序列化程序都将无法腌制非python对象。 Tkinter
不会。
您可以在dill
(在dill.settings
中)尝试不同的序列化变体,但可能会失败。
您可以潜在地构建窗口小部件的派生类,其中添加了序列化指令,这些指令通知序列化程序如何存储窗口小部件的状态。那应该起作用-从本质上讲,这就是使任何类对象都可序列化的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。