我使用matplotlib和QT4Agg后端在Python中有一个基本的图像查看器程序。 其中一个功能是从2D-FFT生成2D功率谱,并将其放置在一个图中的第二个图中。我想要添加的是一个按钮,它可以将FFT图像弹出到另一个窗口,以便对其进行更详细的分析。
我的代码目前正在做我需要的所有内容,但它也向终端提出了QT异常或某种警告(这是在OS X下运行):
“QCoreApplication :: exec:事件循环已在运行”
def popout(event):
nfig, nfftax = pylab.subplots(1, 1)
imgtoconv = getArr(files[imgindex])
fftimg = np.abs(fftpack.fftshift(fftpack.fft2(imgtoconv)))**2
nfftax.imshow(np.log10(fftimg), cmap=cm.Greys_r)
pylab.show()
我有一个按钮定义并通过Button.on_clicked(popout)链接到popout()函数 在程序的主循环中,启动一个图并用两个图显示。所以pylab.show()已经被调用了一次
我遇到的问题似乎是我再次调用pylab.show(),这会产生异常或警告事件循环已经启动。
我尝试使用pylab.draw()而不是pylab.show(),但是当我这样做时,按钮点击不会显示新的数字
是否有一种简单的方法来抑制此警告?或者是否有另一种方法来生成新图并使其可见而不调用pylab.show()?
编辑:在创建新图和新轴然后在popout()函数结束时调用pylab.draw()之后,我也尝试添加nfig.canvas.draw()。这仍然没有显示新的数字onclickEDIT2:切换到使用TKAgg后端并调用pylab.show()会使问题消失。关于为什么这只是QT4Agg后端问题的任何想法?
答案 0 :(得分:4)
您是否尝试过使用ion()
?当使用按钮回调中的多个数字时,我遇到了同样的问题。对我来说,在popout()
函数中使用此代码解决了问题:
import matplotlib.pyplot as p
import numpy as np
p.ion()
p.close(1)
p.close(2)
p.figure(1)
p.plot(np.random.normal(size=100))
p.figure(2)
p.plot(np.random.normal(size=100))
据我了解,这迫使matplotlib使用自己的线程来处理所有数字,而不会与GUI的主循环冲突。我关闭数字以完全重置它们并释放内存,但p.clf()
也可以。
答案 1 :(得分:0)
如果您尝试在不使用ion()的情况下更新图,请使用此行进行更新
fig.canvas.draw()
在鼠标点击位置绘制红点的示例程序
import matplotlib.pyplot as plt
def plot_on_graph(ix, iy):
global fig
plt.scatter([ix],[iy], color='red')
fig.canvas.draw()
def onclick(event):
global ix,iy
ix, iy = event.xdata, event.ydata
print(ix, iy)
plot_on_graph(ix, iy)
fig = plt.figure()
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()