如何停用'警告:尝试删除时未找到源ID 510 - GLib.source_remove(self._idle_event_id)'?

时间:2015-04-09 14:07:28

标签: python matplotlib gtk glib

执行时

#!/usr/bin/env python

import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4])
plt.show()

(以及更复杂的例子)我得到了

/usr/local/lib/python3.4/dist-packages/
matplotlib/backends/backend_gtk3.py:215: Warning: 
Source ID 7 was not found when attempting to remove it
    GLib.source_remove(self._idle_event_id)

导致这种情况的原因是什么?如何摆脱这些警告?

我知道我可以使用

import warnings
warnings.simplefilter("ignore")

摆脱所有警告,但这不是我要求的。我想要警告,但没有来自matplotlib(特别是上面的那个)。

3 个答案:

答案 0 :(得分:8)

GLib.source_remove未成功,因为之前执行的self.close_event()可能已经完成了这项工作。

This commit应该可以解决您的问题。它是从2月23日开始的。您可以等待下一个版本或手动应用修补程序。

答案 1 :(得分:5)

预先抱歉回答了一个老问题,但是在通过Linux发行版运行的计算机上通过matplotlib安装Python 3.6.9和pip之后,我遇到了类似的问题。我的意图是在所述计算机上升级Python之后能够重新运行涉及pyplot的旧脚本。当脚本运行到完成并提供预期的输出时,我总是收到以下警告:

/home/jefgrailet/.local/lib/python3.6/site-packages/matplotlib/backends/backend_gtk3.py:195: Warning: Source ID 8 was not found when attempting to remove it
  GLib.source_remove(self._idle_draw_id)

使用savefig()中的pyplot方法(我想show()方法也会发生类似的问题)。警告中提到的行对应于backend_gtk3.py中的此方法:

def destroy(self):
    #Gtk.DrawingArea.destroy(self)
    self.close_event()
    if self._idle_draw_id != 0:
        GLib.source_remove(self._idle_draw_id)

我查看了matplotlib GitHub,检查是否存在同一脚本的最新版本,或者是否知道此问题,结果发现上述方法的current implementation仅依赖于self.close_event()指令,即GLib.source_remove()是不必要的。

因此,我在上面的代码中注释了最后两行并保存了更改。进行了此编辑之后,我可以在没有任何警告的情况下运行脚本。我希望这会帮助遇到类似问题的人们。

答案 2 :(得分:4)

使用plt.close()来解决此问题。