2

我在 matplotlib 中有一个散点图,onpick()对它们进行了操作,如下面的 MWE 所示。

Whenever a point is selected, I run a computation on that point, that takes about 30seconds. 我想通过在图中同一点上画一个红色圆圈来通知用户,只要用户点击它。

以下 MWE 有效,但仅在30几秒钟后才绘制红色圆圈:

from numpy import take
from numpy.random import randn
from time import sleep
import matplotlib.pylab as plt

fig, ax = plt.subplots()
X, Y = randn(2, 10)
ax.scatter(X, Y, picker=True)
def onpick(event):
    ax.scatter(take(X, event.ind), take(Y, event.ind), s=40, facecolors='none', edgecolors='red')
    fig.canvas.draw()
    sleep(30)#here I have MyLongComputation() in my code

fig.canvas.mpl_connect('pick_event', onpick)
plt.show()

有没有办法要求立即生效的绘图动作?万一这很重要,我会以交互模式从 Ipython 调用文件。

请注意,fig.canvas.draw()matplotlib 不会忽略我的调用,而只会推迟到onpick()返回时。

4

1 回答 1

2

隐藏的主循环仅在两次更新绘图之间运行,您需要以让 GUI 继续工作的方式开始长时间计算,这可以是:

然后当它通知它完成显示结果时。好消息是您可以对结果请求进行排队,以便您的用户可以点击几个点(每个点立即突出显示)、去吃午饭或周末离开。

请注意,python 中的 sleep 块。

于 2013-10-15T14:46:23.267 回答