使用mplcursors点击画布时触发AttributeError问题求助
mplcursors点击画布空白区域触发AttributeError错误
使用mplcursors实现悬停显示线条标签时,点击线条后再点击画布空白区域会触发AttributeError: 'NoneType' object has no attribute 'canvas'错误,甚至官网提供的基础示例代码也能复现该问题。
复现代码
import matplotlib.pyplot as plt import numpy as np import mplcursors data = np.outer(range(10), range(1, 5)) fig, ax = plt.subplots() lines = ax.plot(data) ax.set_title("Click somewhere on a line.\nRight-click to deselect.\n" "Annotations can be dragged.") mplcursors.cursor(lines) # 或者直接使用 mplcursors.cursor() plt.show()
报错信息
H:\>python C:\Users\m312945\Desktop\Paul\Scripts\Cluster\test_animation_test_mp.py Traceback (most recent call last): File "C:\Python39\lib\site-packages\matplotlib\cbook\__init__.py", line 304, in process func(*args, **kwargs) File "C:\Python39\lib\site-packages\matplotlib\offsetbox.py", line 1550, in on_release if self._check_still_parented() and self.got_artist: File "C:\Python39\lib\site-packages\matplotlib\offsetbox.py", line 1560, in _check_still_parented self.disconnect() File "C:\Python39\lib\site-packages\matplotlib\offsetbox.py", line 1568, in disconnect self.canvas.mpl_disconnect(cid) File "C:\Python39\lib\site-packages\matplotlib\offsetbox.py", line 1517, in <lambda> canvas = property(lambda self: self.ref_artist.figure.canvas) AttributeError: 'NoneType' object has no attribute 'canvas'
解决方法
方案1:升级mplcursors到最新版本
该bug在mplcursors的后续更新中已被修复,执行以下命令完成升级:
pip install --upgrade mplcursors
方案2:手动修改matplotlib源码(临时方案)
如果无法升级依赖,可以修改matplotlib的offsetbox.py文件,在_check_still_parented方法中增加空值判断:
找到C:\Python39\lib\site-packages\matplotlib\offsetbox.py中的_check_still_parented函数,修改为:
def _check_still_parented(self): if self.ref_artist is None or self.ref_artist.figure is None: self.disconnect() return False return True
内容的提问来源于stack exchange,提问作者Paul K.
相关产品推荐
相关产品推荐

