我想通过鼠标点击一系列数字以交互方式创建多边形并存储坐标。截至目前,我只能为一个数字执行此操作,因为循环继续并且不等待click事件完成。我究竟做错了什么?在绘图之前我的所有数据处理是否应该在我的onclick函数内完成?这是我的代码片段。
import numpy as np
import matplotlib.pyplot as plt
def onclick(event):
global ix, iy
ix, iy = event.xdata, event.ydata
global coords
coords.append((ix, iy))
if len(coords) == 8: # allow for 8 clicks
fig.canvas.mpl_disconnect(cid)
plt.close()
for j in np.arange(len(folders)):
# loop through folders
for i in np.arange(len(files)):
# loop through files in folders
# do data processing
coords = []
fig = plt.figure(figsize=(12,12))
cid = fig.canvas.mpl_connect('button_press_event', onclick)
更新:我添加了一个简单的示例来说明我要做的事情。代码确实运行但它不能完成我想要它做的事情。我想绘制一个底图,在地图上绘制一个不同时间的点,并为每个实例获得8次点击的鼠标坐标。截至目前,它根本没有做我想要的。我通常不会使用函数,也不是Tkinter的新手,所以我们非常感谢您的帮助。
from pylab import *
close("all")
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
def onclick(event):
global coords
global ix, iy
ix, iy = event.xdata, event.ydata
global coords
coords.append((ix, iy))
print 'x = %d, y = %d'%(ix, iy)
plotloop()
if len(coords) == 8:
plt.close()
fig.canvas.mpl_disconnect(cid)
def plotloop():
plotlat = [35.,36.,37.,38.]
plotlon = [-125.,-125.,-125.,-125.]
x, y = bm(plotlon, plotlat)
global i
for i in np.arange(0,5):
if i == 4:
plt.close()
fig.canvas.mpl_disconnect(cid)
else:
bm.plot(x[i],y[i],color='r')
plt.show()
ll_lat_nam = 30.
ll_lon_nam = -130.
ur_lat_nam = 45.
ur_lon_nam = -115.
lon_0_nam = (ll_lon_nam + ur_lon_nam)/2.
fig = plt.figure(figsize=(12,12))
bm = Basemap(projection='lcc',resolution='i',llcrnrlon=ll_lon_nam,llcrnrlat=ll_lat_nam,urcrnrlon=ur_lon_nam,urcrnrlat=ur_lat_nam,lon_0=-95.,lat_0=25.)
bm.drawcoastlines(linewidth=1.25)
bm.drawstates(linewidth=1.25)
bm.drawcountries(linewidth=1.25)
bm.drawparallels(np.arange(20.,60.,5.),labels=[True,False,False,False],zorder=5,fontsize=12,linewidth=1.0)
bm.drawmeridians(np.arange(-140.,-100.,5.),labels=[False,False,False,True],zorder=5,fontsize=12,linewidth=1.0)
coords = []
cid = fig.canvas.mpl_connect('button_press_event', onclick)