pylab.show() "QCoreApplication::exec: 事件循环已经在运行"
Posted
技术标签:
【中文标题】pylab.show() "QCoreApplication::exec: 事件循环已经在运行"【英文标题】:pylab.show() "QCoreApplication::exec: The event loop is already running" 【发布时间】:2014-12-03 20:14:01 【问题描述】:我有一个基本的 Python 图像查看器程序,使用 matplotlib 和 QT4Agg 后端。 其中一项功能是从 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() 的情况下生成新图形并使其可见?
编辑:我还尝试在创建新图形和新轴之后添加 nfig.canvas.draw(),然后在 popout() 函数的末尾调用 pylab.draw()。这仍然没有在点击时显示新图
EDIT2:切换到使用 TKAgg 后端并调用 pylab.show() 使问题消失。关于为什么这只是 QT4Agg 后端中的一个问题的任何想法?
【问题讨论】:
【参考方案1】:您是否尝试过使用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()
也可以。
【讨论】:
我必须在某个时候检查一下这是否有效。从那以后,我对代码进行了重大更改,通过 PyQt4 将 mpl 嵌入到 QT 中【参考方案2】:如果您尝试更新绘图 不使用 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()
【讨论】:
以上是关于pylab.show() "QCoreApplication::exec: 事件循环已经在运行"的主要内容,如果未能解决你的问题,请参考以下文章
pylab.hist(数据,规范=1)。规范化似乎工作不正确
错误:- "code":"403", "message":"HMAC 验证失败"
如何将 ["tag":"google","count":1,"tag":"microsoft",&q