保存Tkinter Canvas对象

时间:2014-11-17 23:53:33

标签: python tkinter

如何保存Canvas对象,以便稍后修改(删除图纸,添加图纸等)?

我尝试过泡菜,但它给了我一个错误:pickle.PicklingError: Can't pickle 'tkapp' object: <tkapp object at 0x024A7678>

canvas = Canvas()

canvas.create_oval(10, 10, 80, 80, outline="red", fill="green", width=10)

file_name = "test_file"

with open(file_name, 'wb') as file_object:
    pickle.dump(canvas, file_object)

1 个答案:

答案 0 :(得分:1)

可能有更直接的解决方案,但我通常通过保存指示绘图的对象并在每个会话中为它们传递新画布来处理此问题。无论如何,这通常适合设计良好的基础设施 - 它将图像与数据分开。

例如,您可能会分别跟踪椭圆形,如下所示:

class Oval:

    def __init__( self, x , y ):
        self.x = x 
        self.y = y

   def draw_to_canvas(self,canvas):
       canvas.create_oval( ..., ... )

newoval = Oval(0,0)
pickle.dump(newoval,myfile)

我不确定你需要多长时间来挑选实际的tkinter画布 - 制作一个新的画布非常简单。你想要的是画布上对象的保存版本,你可以通过挑选你自己跟踪数据的自定义类来获得。在我看来,Tkinter通常不够强大,不能充当数据结构和画布,也不像是一个非常优雅的设计,让它同时充当两者。

当然,如果您正在尝试制作绘图引擎,那么挑选椭圆列表或分层树状容器可能更有效。这是所有特定用途的