繁体   English   中英

从iPython Shell运行时matplotlib mpl_connect中的事件滞后

[英]Event lag in matplotlib mpl_connect when run from iPython shell

我正在尝试编写一个非常简单的小“ 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运行相同的例程时,不会发生这种延迟,但是在这种情况下,它似乎也无法正确退出。 我很想知道区别是什么,以及我写的东西是否有些古怪。

我正在Windows 7 64位上的Anaconda 1.8安装中的Spyder 2.2.5中运行此程序。

添加:我已经使用Qt4Agg后端在iPython qtconsole和普通iPython中进行了尝试。 使用qtconsole时会发生此问题,但使用纯iPython时不会发生。 有人知道两者之间的事件处理方式可能不同吗?

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

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

import sys

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM