TypeError:使用莳萝库时无法腌制_tkinter.tkapp对象

时间:2020-08-29 10:23:32

标签: python tkinter compiler-errors pickle dill

所以,我有这样的课:

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()

2 个答案:

答案 0 :(得分:0)

您正在尝试腌制对象列表。这些对象均包含一个小部件。您不能腌制小部件。根本做不到。

答案 1 :(得分:0)

我是dill的作者。我同意@Bryan_Oakley。但更明确地说,_tkinter不是python(我相信它是C ++)。问题是,除非位于其上方的python类提供了序列化指令(如numpy数组那样),否则任何python序列化程序都将无法腌制非python对象。 Tkinter不会。

您可以在dill(在dill.settings中)尝试不同的序列化变体,但可能会失败。

您可以潜在地构建窗口小部件的派生类,其中添加了序列化指令,这些指令通知序列化程序如何存储窗口小部件的状态。那应该起作用-从本质上讲,这就是使任何类对象都可序列化的方法。