Eclipse 中的 PyDev Seaborn:PyDev 自动完成弹出窗口上的 "QPixmap: It is not safe to use pixmaps outside the GUI thread"

PyDev Seaborn in Eclipse: "QPixmap: It is not safe to use pixmaps outside the GUI thread" on PyDev autocompletion popup

我遇到了错误

QPixmap: It is not safe to use pixmaps outside the GUI thread

ipython-shell 中使用 PyDev 在 Eclipse 中手动在 Seaborn 中输入以下语句时:

import matplotlib.pyplot as mpl
import seaborn as sns
import pandas as pd
import numpy as np

# Turn interactive mode off:
mpl.ioff()

# Create some example Data:
df = pd.DataFrame({'A':np.random.rand(20),'B':np.random.rand(20)})

# Create seaborn PairGrid instance:
pg = sns.PairGrid(df)

此时,当我用一个点继续最后一个语句时,例如链接一个 map() 方法,像这样:

pg = sns.PairGrid(df).

然后 Eclipse 试图显示所有可能完成的弹出窗口,但该弹出窗口立即关闭并且控制台充满上述错误,准确地说是 42 行。

我可以毫无问题地继续这样做:

gp = sns.PairGrid(df).map(mpl.scatter)
gp.fig.show()

而且我的情节很好。

sns.JointGrid(df.A,df.B).sns.FacetGrid(df).

时也会发生同样的情况

在早些时候玩游戏时,我也遇到过控制台实际上被这个错误杀死的情况,我只是无法再复制导致这种情况的步骤。

在这个站点上进行研究后发现它似乎与我根本没有使用的线程有关。 Seaborn 使用它吗?

我想通过先创建一个 Grid/Figure 并在稍后进行绘图来创建我的绘图,但是这个错误表明这不是一种安全的做事方式,尽管 Seaborn 文档说这样做很好是这样的:

https://seaborn.github.io/generated/seaborn.FacetGrid.html

编辑:

在 Spyder 中做同样的事情时,我没有收到错误,但是在做 gp.fig.show():

时出现了这个警告
C:\Anaconda2\lib\site-packages\matplotlib\figure.py:397: UserWarning: 
matplotlib is currently using a non-GUI backend, so cannot show the figure
"matplotlib is currently using a non-GUI backend, "

当交互模式关闭时,我看不到任何图形。启用交互模式后,我仍然会看到警告,但会得到内联图形。

虽然在这两种情况下都没有弹出窗口。在 Eclipse 中,我同时收到错误和弹出窗口。

编辑 2:

运行 Eclipse 中作为脚本的整个过程不会产生任何错误,只有如上所述的手动输入才会产生错误。

我查看了 https://github.com/fabioz/Pydev/blob/master/plugins/org.python.pydev/pysrc/pydevconsole.py,问题是 PyDev 上的代码完成是在辅助线程中触发的,而不是在主 (UI) 线程中触发的。

即:交互式控制台中的代码完成并不期望它会触及实际与 gui 交互的代码。

为此,完成命令必须在主线程排队(因为常规命令排队)并且线程必须等待它完成然后 return 它的值。

请在 PyDev 跟踪器中将此作为问题报告:https://www.brainwy.com/tracker/PyDev/(即:交互式控制台中的代码完成应发生在 UI 线程中)。