pylab.show()“QCoreApplication :: exec:事件循环已经在运行”

时间:2014-12-03 20:14:01

标签: python qt exception-handling pyqt4

我使用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()。这仍然没有显示新的数字onclick

EDIT2:切换到使用TKAgg后端并调用pylab.show()会使问题消失。关于为什么这只是QT4Agg后端问题的任何想法?

2 个答案:

答案 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()