我绘制了一组点并将绘图嵌入到Tkinter画布中。我想要做的是在点击一个/多个点时检索坐标。我能够使用以下代码(嵌入到Tkinter之前)来完成它。但是,它仅适用于迭代中的第一个绘图。如何在接下来的2个图中展开它?有人可以解释一下需要使用画布进行的更改吗?
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 :(得分:1)
我认为这与您尝试使用循环创建多个Tk
实例,并尝试在每个实例上调用mainloop
这一事实有关。对于给定的应用程序,应该只有一个Tk
,因此只能在该单个实例上调用mainloop
。
在进入Tk
循环之前创建根for
实例。进入循环后,使用TopLevel
小部件将每个绘图窗口创建为该根的子节点。循环结束后,请在根目录上调用mainloop
。
这是一个应该有效的非常粗略代码大纲:
# Code before loop just as it is, except you create your root Tk instance here...
root = Tk.Tk()
# Now start the loop
for i in range(3):
win = Tk.TopLevel(root)
win.title(text="Embed in Tk")
...
# The rest of your plot-building code goes here, with all new widgets
# as children of the window "win"
# Now that the loop is finished, call mainloop
root.mainloop()
无法访问您的数据(以及您正在使用的其他模块),很难确定这是否适用于您需要的内容,但应该执行此操作。< / p>
为了更有效地工作,您可能需要考虑为每个绘图窗口构建一个类(子类化TopLevel
),然后使用循环创建三个实例,将适当的数据传递给每个实例。这样,每个情节的窗口和操作都可以被隔离。