【问题标题】:Event lag in matplotlib mpl_connect when run from iPython shell从 iPython shell 运行时 matplotlib mpl_connect 中的事件滞后
【发布时间】:2014-01-27 20:58:31
【问题描述】:

我正在尝试编写一个非常简单的小“gui”,它允许用户单击图像并将位置和值打印到屏幕上。我有什么工作,但我发现从 iPython shell 运行它时,打印输出中有 1 个事件延迟。

当我运行例程时,第一次点击什么也没做。第二次单击允许显示第一次单击的打印输出。当我右键单击时,例程可以正常退出(这是我想要的),但奇怪的是必须有一个缓冲区仍然存在,因为如果我再次运行例程,最后一次单击的值在我做任何事情之前就被打印出来了。

代码如下:

import matplotlib.pyplot as plt
import numpy as np

def pickPoint(data):
    """Displays a 2D array on the screen and prints data info based upon user clicks."""

    def pickPointSelectVal(event):
        if event.button == 3:
            fig.canvas.mpl_disconnect(cid)
            plt.close(fig)
        else:
            print 'got click: ', event.x, ',', event.y, ' value: ', data[event.x,event.y]

    dims = data.shape
    dpi = 96.0
    fdims = (x/dpi for x in dims)

    fig = plt.figure(figsize=fdims, dpi=dpi)
    plt.figimage(data.transpose(),origin='lower',cmap='gray')
    cid = fig.canvas.mpl_connect('button_press_event', pickPointSelectVal)

if __name__ == "__main__":
    a = np.arange(500)
    b = np.reshape(np.repeat(a,100),(500,100))
    c = b * np.reshape(np.repeat(np.arange(100),500),(100,500)).transpose()
    pickPoint(c)

点击几下运行两次仅在第一次会产生以下输出:

In [1]: pickPoint(c)
got click:  60 , 80.0  value:  4800
got click:  45 , 25.0  value:  1125
got click:
In [2]: pickPoint(c)
 267 , 76.0  value:  20292

"c" 是虚拟数组。请注意,当我从普通 Python shell 运行相同的例程时,不会发生这种延迟,但在这种情况下,它似乎也不会正确退出。我很想知道有什么区别,以及我所写的内容是否有些古怪。

我在 Spyder 2.2.5 中通过在 Windows 7 64 位上安装 Anaconda 1.8 来运行它。

添加: 我已经在 iPython qtconsole 和普通 iPython 中尝试过这个,两者都使用 Qt4Agg 后端。使用 qtconsole 时会出现此问题,但使用普通 iPython 时不会出现此问题。有人知道两者之间的事件处理方式不同吗?

【问题讨论】:

  • edit您的问题列出您的导入,以便我们也可以运行您的程序。此外,您是否尝试过从 IPython 控制台、笔记本或 qtconsole 运行它以查看它是否在那里工作?很好的缓冲可能是 Spyder 的事情......
  • 我已经用导入更新了代码...我会尝试 qtconsole 看看会发生什么...
  • 我在 iPython qtconsole 中尝试了它并得到了同样的结果,但随后在 Spyder 之外的“普通”iPython 控制台中尝试了它并让它正常工作。嗯。

标签: python user-interface matplotlib ipython


【解决方案1】:

好吧,我设法找到了这个问题——事实证明这是 QtConsole 的一个已知问题,根本原因与this 问题相同(Canopy 和 Spyder 在其 GUI 中都使用 ipython qtconsole)。问题是第一次打印不会触发标准输出的刷新(几年前可以找到更好的解释here),所以你必须a)手动执行,如下所示,或者b)使用ipython -u 用于无缓冲输出,我没有尝试过。手动刷新对我来说效果很好,所以我现在就这样做。

如果我将以下内容添加到我的代码中,它会按预期工作:

import sys

# (put this after the print statement)
sys.stdout.flush()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多