如何从tkinter中的父框清除/更新子窗口小部件中的图?

时间:2014-04-10 22:07:11

标签: python tkinter

我试图找出如何清除画布(在tkinter中)作为画面的子画面的情节。我的问题是,这发生在show()函数内部,与创建框架的类不同。因此关于show()的想法是它将被多次调用,而不是每次调用show()时都会破坏小部件并从头开始创建所有内容,我希望画布中的内容是一个孩子的框架被清除/更新,但小部件被保留。

这可能在伪代码中更容易理解:

class A():
    def__init__(self, master):
        sframe = Frame(master)
        sframe.pack(side=RIGHT)
        f = Figure(figsize=(3,2), dpi=100)

        a = f.add_subplot(122);
        # initially plots a sine wave 
        t = arange(0.0, 1, 0.01);
        s = sin(2*pi*t);
        a.plot(t,s);

        canvas = FigureCanvasTkAgg(f, master=sframe)
        canvas.show()
        canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
        # now i create the other object that will call show()
        data_obj = B(sframe)


class B():
    ...
    show(self, frame):
       _wlist = frame.winfo_children()
       for item in _wlist:
           item.clear() # or something like this
       # and then re-plot something or update the current plot

代码的最后一部分是我遇到问题的地方。我不知道如何清除框架中的小部件。我如何知道它是哪种类型的小部件以及如何清除或更新它?我明白了:

*** AttributeError: Canvas instance has no attribute 'clear'

任何想法都非常受欢迎。非常感谢!

1 个答案:

答案 0 :(得分:0)

我没有清除画布的子画面(使用winfo_class()),而是在框架中传递了图形的轴,并且还传递了画布。

在A班:

frame.canvas = canvas
frame.ax = a

然后在B类中我们使用框架清除轴来访问它,更新它并显示画布:

self.sframe.ax.clear()
self.sframe.ax.plot(newline)
self.sframe.canvas.show()

如果您知道通过浏览框架的子项来访问轴的方法,请告诉我......