使用matplotlib进行绘图时,如何避免PyCharm控制台崩溃“警告:在main()线程中未创建QApplication”?

时间:2019-05-04 00:07:53

标签: python multithreading qt matplotlib pycharm

在PyCharm中,当我尝试使用其交互式控制台绘制某些内容时,例如:

In[2]: from matplotlib.pyplot import *
In[3]: x = range(5)
In[4]: y = range(5,10)
In[5]: plot(x,y)
WARNING: QApplication was not created in the main() thread.
Out[5]: [<matplotlib.lines.Line2D at 0x7fade916a438>]
In[6]: show()

它打开一个窗口并崩溃。我必须停止控制台并启动一个新控制台。

screenshot of the error

当我在终端的ipython控制台中运行类似的命令时,它工作正常,看来错误仅在Pycharm中发生。

反之,如果使用import matplotlib.pyplot as plt导入matplotlib可以正常工作:

In[2]: import matplotlib.pyplot as plt
In[3]: x = range(5)
In[4]: y = range(5,10)
In[5]: plt.plot(x,y)
Out[5]: [<matplotlib.lines.Line2D at 0x7fd3453b72e8>]
In[6]: plt.show()

但是如果我同时做这件事,它也会崩溃(甚至使用plt.plot调用plot函数):

In[2]: from matplotlib.pyplot import *
In[3]: import matplotlib.pyplot as plt
In[4]: x = range(5)
In[5]: y = range(5,10)
In[6]: plt.plot(x,y)
WARNING: QApplication was not created in the main() thread.
Out[6]: [<matplotlib.lines.Line2D at 0x7fade916a438>]
In[7]: plt.show()

此外,当我在一个命令中运行所有命令时,它第一次起作用。但是,如果我尝试绘制其他时间,则会崩溃:

In[2]: from matplotlib.pyplot import *
  ...: x = range(5)
  ...: y = range(5,10)
  ...: plot(x,y)
  ...: show()
In[3]: plot(x,y)
WARNING: QApplication was not created in the main() thread.
Out[3]: [<matplotlib.lines.Line2D at 0x7fc68a3009e8>]
In[4]: show()

所以这与在使用*导入时使用matplotlib库以及在首次导入后在交互式控制台中运行有关。我知道不建议使用通配符导入,但是有时这样做对于加快测试速度和减少冗长的工作很有用。

在网上查找此警告,我只找到了这些

这没什么帮助。任何人都知道发生了什么事以及如何解决?

SPECS:

  • PyCharm 2019.1.2(专业版)
  • 内部版本#PY-191.7141.48,建于2019年5月7日
  • JRE:11.0.2 + 9-b159.56 amd64
  • JVM:JetBrains s.r.o的OpenJDK 64位服务器VM
  • Linux 4.15.0-50-通用
  • conda 4.6.14,使用Python 3.7.3
  • Qt5

2 个答案:

答案 0 :(得分:3)

我已将此问题发送给JetBrains:https://youtrack.jetbrains.com/issue/PY-36136

他们还找不到解决方案,但是他们建议的解决方法如下:

文件|中禁用在工具窗口中显示图设置|工具| Python科学

这对我有用,尽管它没有显示在PyCharm窗口中。

答案 1 :(得分:1)

您可以尝试以下几种方法:

首先,您可以尝试更新Qt。您可能有一些旧版本。运行

print(plt.get_backend())

验证您正在使用哪个后端。如果您使用的是Qt4,请尝试使用Qt5后端。

接下来,通过

Qt5更新为最新版本
pip install --upgrade PyQt5

此外,您可以尝试抛弃Qt并切换到Tk后端:添加

import matplotlib
matplotlib.use('TkAgg')

在导入pyplot

之前