2013-06-12 6 views
0

나는 점 집합을 플롯하고 Tkinter 캔버스에 플롯을 임베드했습니다. 내가 뭘하려는 하나 이상의 포인트를 클릭하면 좌표를 검색 할 수 있습니다. Tkinter에 임베드하기 전에 다음 코드를 사용하여 수행 할 수있었습니다. 그러나 반복의 첫 번째 플롯에서만 작동합니다. 다음 2 개의 플롯을 위해 어떻게 확장합니까? 변경 사항을 캔버스를 사용하여 수행해야한다고 설명 할 수 있습니까?Tkinter 캔버스에서 좌표 가져 오기

outl=[] 
index = [] 
list_rep = [] 
def on_pick(event): 
     thisline = event.artist 
     xdata, ydata = thisline.get_data() 
     tmp = [] 

     index.append(i) 
     ind = event.ind 
     tmp.append(list(xdata[ind])[0]) 
     tmp.append(list(ydata[ind])[0]) 
     outl.append(tmp) 


     #print('on pick line:', zip(xdata[ind], ydata[ind])) 

new_ydata1 = [] 
new_ydata2 = [] 
new_ydata3 = [] 
for i in range(3): 
     root = Tk.Tk() 
     root.wm_title("Embed in Tk") 

     ydata1 = np.array(Max_Correct_1[i]) 
     ydata2 = np.array(Max_Correct_2[i]) 
     ydata3 = np.array(Max_Correct_3[i]) 

     Aveg=np.array(Avg[i]) 


     f = Figure(figsize=(5,4), dpi=100) 
     ax1 = f.add_subplot(111) 

     ax1.axis([-9.5,-4.0,-10,105]) 
     ax1.plot(Log_Values_Array,ydata1,'o',picker=7) 
     ax1.plot(Log_Values_Array,ydata2,'*',picker=7) 
     ax1.plot(Log_Values_Array,ydata3,'^',picker=7) 
     ax1.plot(Log_Values_Array,Aveg,'b--') 

     canvas = FigureCanvasTkAgg(f, master=root) 

     canvas.show() 
     canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 


     canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1) 

     canvas.mpl_connect('pick_event',on_pick) 




     print outl 



     canvas.get_tk_widget().delete("all") 
     outl=[] 
     index = [] 
     Tk.mainloop() 
+0

좌표를 수집 할 수 있었지만 다른 문제가 있습니다. 루프를 실행하고 있으므로 3 플롯의 경우 플롯의 좌표를 선택하지만 후속 플롯의 경우는 선택하지 않습니다. 어딘가에 누락 된 명확한/업데이트가 있습니까? – user2332994

+0

이 matplotlib를 사용하고 있습니까? 그렇다면 태그를 추가하거나 설명에 정보를 추가 할 수 있습니다. 또한 특정 전화 번호에 대해 불평하지만 불만 사항이 무엇인지 표시하지 마십시오. 실제 오류를 표시 할 수 있습니까? –

+0

안녕하세요, Bryan, 이벤트 오류를 ​​없앨 수 있었지만 아래 코드에서 플롯을 반복하고 일부 계산을 위해 점을 선택하면 플롯 # 1에서만 적용됩니다. 플롯 2와 3의 경우 pick_event가 작동하지 않는 것 같습니다. – user2332994

답변

1

나는 이것이 당신이 루프를 사용하여 Tk 하나 개 이상의 인스턴스를 만들려고하고, 각각에 mainloop 전화를 위해 노력하고 있다는 사실과 함께 할 수있는 뭔가가 생각합니다. 해당 응용 프로그램에 대해 Tk 하나만 있어야하므로 해당 단일 인스턴스에 mainloop 만 호출하면됩니다.

루트 Tk앞에 전에 루프를 작성하면 for 루프가됩니다. 루프 안에 일단 TopLevel 위젯을 사용하여 각 플롯 창을 해당 루트의 하위로 만듭니다. 루프가 끝나면 루트에서 mainloop으로 전화하십시오. 여기

작동해야 매우 거친 코드 개요입니다 :

를 데이터 (당신이 사용하고있는 다른 모듈)에 액세스하지 않고, 작동하는지 확인하기 어려울 것이다 당신이 필요로하는 것을 위해, 그러나 해야한다.

더 효과적으로 작업하려면 각 플롯 창 (서브 클래스 TopLevel)에 대한 클래스를 작성한 다음 루프를 사용하여 세 개의 인스턴스를 작성하고 각 인스턴스에 적절한 데이터를 전달하는 방법을 고려할 수 있습니다. 이렇게하면 각 플롯의 창과 작업을 분리 할 수 ​​있습니다.