暂停Python脚本,直到用户点击两次绘图

时间:2017-10-06 02:39:26

标签: python events matplotlib

我正在尝试编写一个脚本,用于保存绘图中前两次鼠标点击的坐标(通过matplotlib生成),暂停脚本直到发生这些点击。我试图用while循环实现“暂停”,一旦回调函数检测到鼠标被点击两次就应该完成。但是,一旦while循环开始运行,单击绘图区域似乎没有任何效果。任何帮助将不胜感激。

coords = []
pause = True

fig, ax = plt.subplots()
plt.pcolormesh(x_grid, y_grid, arr)
plt.show()

def onclick(event):
    global coords
    coords.append((event.xdata, event.ydata))
    if (len(coords)==2):
        pause = False
        fig.canvas.mpl_disconnect(cid)

cid = fig.canvas.mpl_connect('button_press_event', onclick)

while pause:
    pass

# ...More code to follow, after the while loop finishes

1 个答案:

答案 0 :(得分:1)

编辑答案: 我会调查这样的东西,他们有一个演示应用程序,但这似乎正是你想要的功能。

https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.ginput.html

这会将您的代码转换为:

plt.pcolormesh(x_grid, y_grid, arr)
coords = plt.ginput(2, show_clicks=False)
plot.show(block=False)

这将返回窗口中的前两个单击坐标,并打开图。

- 原始答案

您是否关注点击后打开的情节?如果没有,那么您可以删除while循环,因为plt.show()函数本身就是阻塞的。然后是新版本的代码:

coords = []
fig, ax = plt.subplots()
plt.pcolormesh(x_grid, y_grid,arr)

def onclick(event):
    global coords
    coords.append((event.xdata, event.ydata))
    if (len(coords)==2):
        fig.canvas.mpl_disconnect(cid)
        plt.close()

cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()
print('Finished')

你可以随时(假设情节不会超长渲染)之后只需要打电话:

plt.pcolormesh(x_grid, y_grid, arr)
plt.show(block=False)

在点击过程完成后生成绘图的非阻止版本。 (这似乎很愚蠢,但我似乎无法找到一种快速的方法将阻塞图转换为非阻塞图)