2014-04-10 4 views
0

프레임의 자식 인 캔버스 (tkinter)에서 플롯을 지우는 방법을 찾으려고합니다. 내 문제는 프레임을 만든 클래스와 다른 클래스의 show() 함수에서 발생한다는 것입니다. 그래서 show()에 대한 아이디어는 여러 번 호출 될 것이고 show()가 호출 될 때마다 위젯을 파괴하고 처음부터 모든 것을 생성하는 대신 캔버스 내부의 음모를 프레임은 지워지거나 업데이트되지만 위젯은 보존됩니다.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

캔버스 클래스 인 (winfo_class()를 사용하여) 프레임의 자식을 지우는 대신 프레임의 그림 축을 통과시키고 캔버스를 전달했습니다. 클래스 A에서

:

frame.canvas = canvas 
frame.ax = a 

그런 클래스 B에서 우리는, 액세스를 업데이트하고 캔버스 보여 프레임을 사용하여 축을 취소 할 때 : 당신이 방법을 알고 있다면

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

을 프레임의 자식을 탐색하여 축에 액세스하려면 ...

관련 문제