我正在与pycharm社区合作使用keras后端的tensorflow模型,有时这个错误会在随机时间出现,特别是在我调用pyplot并关闭窗口之后:
Exception ignored in: <bound method Image.__del__ of <tkinter.PhotoImage object at 0x7ff6406fad30>>
Traceback (most recent call last):
File "/usr/lib/python3.6/tkinter/__init__.py", line 3507, in __del__
self.tk.call('image', 'delete', self.name)
RuntimeError: main thread is not in main loop
在这个错误之后,我需要关闭python控制台并再次加载我的数据,这很耗时(数据是一个大数据集,内存使用量相当大)
如何解决此问题?
更新:这里是情节代码:
import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
import numpy as np
data = np.ones((256,256))
fig = plt.figure()
ax = fig.add_subplot(111)
temp = np.transpose(data)
plt.title('title')
im = ax.imshow((temp), aspect='auto')
fig.colorbar(im)
plt.axes()
data2 = np.ones((256,256))
fig = plt.figure()
ax = fig.add_subplot(111)
temp = np.transpose(data2)
plt.title('title')
im = ax.imshow((temp), aspect='auto')
fig.colorbar(im)
plt.axes()
更新2:
PyCharm 2021.2.3(Community Edition)
build PC-212.5457.59
Runtime version: 11.0.12+7-b1504.40 amd64
我安装了以下软件包:
Package Version
----------------------- -------------------
absl-py 0.9.0
appdirs 1.4.3
apturl 0.5.2
asn1crypto 0.24.0
astor 0.8.1
bleach 2.1.2
Brlapi 0.6.6
certifi 2018.1.18
chardet 3.0.4
command-not-found 0.3
control 0.9.0
cryptography 2.1.4
cupshelpers 1.0
cycler 0.10.0
decorator 4.4.2
defer 1.0.6
distlib 0.3.0
distro-info 0.18ubuntu0.18.04.1
entrypoints 0.2.3.post1
filelock 3.0.12
gast 0.2.2
google-pasta 0.1.8
graphviz 0.14
grpcio 1.27.2
h5py 2.10.0
html5lib 0.999999999
httplib2 0.9.2
idna 2.6
imageio 2.9.0
imageio-ffmpeg 0.4.3
imgviz 1.2.5
importlib-metadata 1.5.0
importlib-resources 1.3.1
ipykernel 4.8.2
ipython 5.5.0
ipython-genutils 0.2.0
ipywidgets 6.0.0
Jinja2 2.10
joblib 0.14.1
jsonschema 2.6.0
jupyter-client 5.2.2
jupyter-core 4.4.0
Keras 2.4.3
Keras-Applications 1.0.8
Keras-Preprocessing 1.1.0
keyring 10.6.0
keyrings.alt 3.0
kiwisolver 1.1.0
labelme 4.5.7
language-selector 0.1
launchpadlib 1.10.6
lazr.restfulclient 0.13.5
lazr.uri 1.0.3
llvmlite 0.34.0
louis 3.5.0
macaroonbakery 1.1.3
Markdown 3.2.1
MarkupSafe 1.0
matplotlib 3.0.3
mistune 0.8.3
moviepy 1.0.3
nbconvert 5.3.1
nbformat 4.4.0
netifaces 0.10.4
networkx 2.5.1
notebook 5.2.2
numba 0.51.2
numpy 1.19.5
oauth 1.0.1
olefile 0.45.1
opt-einsum 3.2.0
pandas 1.0.4
pandocfilters 1.4.2
pexpect 4.2.1
pickleshare 0.7.4
Pillow 5.1.0
pip 20.0.2
proglog 0.1.9
prompt-toolkit 1.0.15
protobuf 3.11.3
pycairo 1.16.2
pycrypto 2.6.1
pycups 1.9.73
pydot 1.4.1
pydot-ng 2.0.0
pydotplus 2.0.2
Pygments 2.2.0
pygobject 3.26.1
pymacaroons 0.13.0
PyNaCl 1.1.2
pyparsing 2.4.6
pyRFC3339 1.0
python-apt 1.6.5+ubuntu0.5
python-dateutil 2.6.1
python-debian 0.1.32
pytz 2018.3
PyWavelets 1.1.1
pyxdg 0.25
PyYAML 3.12
pyzmq 16.0.2
QtPy 1.9.0
reportlab 3.4.0
requests 2.18.4
requests-unixsocket 0.1.5
scikit-image 0.17.2
scikit-learn 0.22.2.post1
scipy 1.4.1
screen-resolution-extra 0.0.0
seaborn 0.11.0
SecretStorage 2.3.1
setuptools 46.0.0
simplegeneric 0.8.1
simplejson 3.13.2
six 1.14.0
sklearn 0.0
system-service 0.3
systemd-python 234
tensorboard 1.14.0
tensorflow-estimator 1.14.0
tensorflow-gpu 1.14.0
termcolor 1.1.0
terminado 0.7
testpath 0.3.1
tifffile 2020.9.3
tornado 4.5.3
tqdm 4.56.2
traitlets 4.3.2
ubuntu-drivers-common 0.0.0
ufw 0.36
unattended-upgrades 0.1
urllib3 1.22
virtualenv 20.0.10
wadllib 1.3.2
wcwidth 0.1.7
webencodings 0.5
Werkzeug 1.0.0
wheel 0.34.2
wrapt 1.12.1
xkit 0.0.0
zipp 3.1.0
zope.interface 4.3.2
2条答案
按热度按时间i86rm4rw1#
看起来这是PyCharm中Tkinter主动跟踪问题的一部分。您可以在Pycharm's developer's issue tracker上找到参考。该问题尚未诊断,但如果查看similar problems with Tk on StackOverflow,可以看到它是线程安全和/或多线程的问题。
我所能做的就是推测原因,这是没有帮助的,但是,我至少可以整理建议的解决方法:
1.切换到不同的Matplotlib后端(参见文档:What is a backend?)。例如Qt 5,但您需要确保它们在您的环境中可用。
这种方法是最有前途的,因为其他后端能够更好地处理不是主线程的情况,或者对于多线程是显式安全的。这也是最简单的,除非您有非常具体的原因更喜欢TkAgg。
1.不要将调试器用于交互式绘图。
1.在Debugger中将“Variables Loading Policy”设置为“Synchronously”,这是一个PyCharm开发人员在链接问题中建议的。
1.在Pycharm中启用“科学模式”。
1.更深奥的解决方法,例如在绘制第二个图形之前关闭代码中的图形。例如,在绘制第一个图形之后:
根据对原因的推测,也许PyCharm的调试器正在将Tk从主线程中踢出,或者在图形仍然处于活动状态或呈现时关闭的工作线程中运行它。
最后,请查看Matplotlib的相关文档,因为您的代码示例没有遵循他们推荐的使用模式。具体来说,从链接中了解面向对象和pyplot方法之间的差异。有可能,有点不太可能,如果代码坚持使用Matplotlib的推荐方法,如教程文档中突出显示的那样,错误可能不会出现。这只是推测。
我至少建议不要滥用plt.axes()作为强制渲染图形的迂回方法。您已经使用面向对象的方法
fig.add_subplot
创建了一个轴,因此不需要使用pyplot创建空轴。回想一下,图形可能会占用大量内存,因此,如果您已经因为加载数据集而导致内存不足,您可能会发现更好的性能,并通过正确处理图形来避免使用交换,例如在完成时关闭它们,除非需要,否则不以交互方式呈现它们等。ffx8fchx2#
我也有同样的问题,这种情况间歇性地发生。我想我会分享我在我的例子中发现的东西。我正在Mac上运行我的代码,我在触摸栏上撞到了停止图标。