我试图写一个非常简单的小'gui',它允许用户点击图像并将位置和值打印到屏幕上。我的工作原理,但我发现从iPython shell运行它时,打印输出中有1个事件的延迟。
当我运行例程时,第一次单击不会执行任何操作。第二次单击允许第一次单击的打印输出显示。当我右键单击(这是我想要的)时,例程退出正常,但奇怪的是必须有一个缓冲区,因为如果我再次运行例程,那么在我做任何事情之前,最后一次点击的值都会打印出来。 / p>
以下是代码:
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中运行。
添加: 我在iPython qtconsole和普通iPython中尝试了这一点,两者都使用Qt4Agg后端。使用qtconsole时会出现问题,但使用普通iPython时则不会出现此问题。有人知道两者之间的事件处理方式有何不同?
答案 0 :(得分:1)