2014-04-10 40 views
0

我想了解如何清除畫布(tkinter)中的情節,這是一個框架的孩子。我的問題是,這發生在一個show()函數內的一個不同於創建框架的類中。所以關於show()的想法是,它會被調用很多次,而不是在每次調用show()時從零開始銷燬小部件和創建所有東西,我希望canvas中的plot是一個子項幀被清除/更新,但小部件被保留。如何從tkinter的父框架中清除/更新子部件中的繪圖?

這可能是更容易也許僞代碼來理解:

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' 

任何想法都是值得歡迎的。非常感謝!

+0

沒人?任何想法在哪裏尋找這樣的東西? – edgarbc

+0

我通過清除與幀中圖形相關的軸來解決此問題。最初我想使用框架訪問圖形和軸。然而,我還沒有找到一種方法來做到這一點,所以我在將該軸傳遞給B類的構造函數之前將該軸添加到了框架中。 – edgarbc

回答

0

而不是清除Canvas類的幀(使用winfo_class())的框架的孩子,我傳遞了框架中的圖的軸,並通過畫布。

在A類:

frame.canvas = canvas 
frame.ax = a 

然後,當在B類,我們使用的框架來訪問它,更新它,並顯示畫布清除軸:

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

如果你知道一種方法通過導航框架的孩子訪問軸,讓我知道...

相關問題