2013-06-12 118 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)創建一個類,然後使用該循環創建三個實例,並將相應的數據傳遞給每個實例。這樣每個小區的窗口和操作都可以被隔離。