2014-12-03 88 views
3

我有一个使用matplotlib和QT4Agg后端的Python基本图像查看器程序。 其中一个功能是从2D-FFT生成2D功率谱,并将其放置在一个图中的第二个图中。我想添加的是一个按钮,它将FFT图像弹出并将其弹出到另一个窗口,以便更详细地分析它。pylab.show()“QCoreApplication :: exec:事件循环已经在运行”

我的代码目前正在做的一切,我需要它,但它也提高某种形式的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(跳隙) 定义并链接到跳隙()函数在程序的主循环中的按钮的图被启动,并且具有两个所示地块。所以pylab.show()已经被调用过一次

我遇到的问题似乎是我再次调用pylab.show(),它正在生成异常或警告事件循环已经启动。

我尝试使用pylab.draw()而不是pylab.show(),但是当我这样做,按一下按钮不会显示新图

有一种简单的方法来禁止这种警告?还是有另一种方法来产生新的图形,并使其可见而不回想pylab.show()?

编辑:我也尝试添加nfig.canvas.draw()后创建新图和新轴,然后在popout()函数结束时调用pylab.draw()。这仍然没有显示新的数字onclick

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

回答

3

您是否尝试过使用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()也适用。

+0

我必须在某个时候检查fi这个工程。 我已经改变了我的代码,以通过PyQt4在QT中嵌入mpl – 2015-03-24 16:40:51

相关问题