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)。规范化似乎工作不正确

在 Docker 中运行一个基本的 Qt 应用程序

错误:- "code":"403", "message":"HMAC 验证失败"

如何将 ["tag":"google","count":1,"tag":"microsoft",&q

"message":"请求失败,状态码 500","name":"Error","stack":&q

"errors":"errors":["detail":"您无权执行此操作。","code":&qu