Python Tkinter按钮按下循环

Python Tkinter按钮按下循环,python,tkinter,Python,Tkinter,我想交互式地创建一个多边形使用鼠标点击一系列的数字和存储坐标。到目前为止,我只能对一个图形执行此操作,因为循环将继续,并且不会等待click事件完成。我做错了什么?绘图前的所有数据处理是否应在onclick函数中完成?下面是我的代码片段 import numpy as np import matplotlib.pyplot as plt def onclick(event): global ix, iy ix, iy = event.xdata, event.ydata

我想交互式地创建一个多边形使用鼠标点击一系列的数字和存储坐标。到目前为止,我只能对一个图形执行此操作,因为循环将继续,并且不会等待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)
更新:我添加了一个简单的示例来说明我正在尝试做什么。代码确实运行了,但它没有执行我希望它执行的操作。我想画一个底图,在地图上画一个点4次不同的时间,并为每个实例获得鼠标坐标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)

在np.arange()中,你的
for j循环是否意味着在你的
oneclick()
函数中?@SierraMountainTech我在函数中添加了循环,但我仍然有问题。我已经发布了一个更新。谢谢。顺便说一句,文件夹和文件在你的代码中没有提及任何内容。我没有告诉你在np.arange()中移动j的
我只是问这是否是因为在发布代码时有时会出现缩进错误。我认为您可能希望在自己的函数中有
for
循环,并在每次需要时调用该函数。我无法完全测试您的代码,因为您的一些代码根本不起作用。例子。什么是
文件夹
文件
您的代码中没有使用这些名称引用任何类型的变量。@Mike SMT道歉--我重新发布并包含了一段有效的代码。谢谢你的帮助。你的
for j in np.arange()
循环应该在你的
oneclick()
函数中吗?@SierraMountainTech我在函数中添加了循环,但我仍然有问题。我已经发布了一个更新。谢谢。顺便说一句,文件夹和文件在你的代码中没有提及任何内容。我没有告诉你在np.arange()中移动j的
我只是问这是否是因为在发布代码时有时会出现缩进错误。我认为您可能希望在自己的函数中有
for
循环,并在每次需要时调用该函数。我无法完全测试您的代码,因为您的一些代码根本不起作用。例子。什么是
文件夹
文件
您的代码中没有使用这些名称引用任何类型的变量。@Mike SMT道歉--我重新发布并包含了一段有效的代码。谢谢你的帮助。