所以,我有这样的课:
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()
答案 0 :(得分:0)
您正在尝试腌制对象列表。这些对象均包含一个小部件。您不能腌制小部件。根本做不到。
答案 1 :(得分:0)
我是dill
的作者。我同意@Bryan_Oakley。但更明确地说,_tkinter
不是python(我相信它是C ++)。问题是,除非位于其上方的python类提供了序列化指令(如numpy
数组那样),否则任何python序列化程序都将无法腌制非python对象。 Tkinter
不会。
您可以在dill
(在dill.settings
中)尝试不同的序列化变体,但可能会失败。
您可以潜在地构建窗口小部件的派生类,其中添加了序列化指令,这些指令通知序列化程序如何存储窗口小部件的状态。那应该起作用-从本质上讲,这就是使任何类对象都可序列化的方法。