通过事件处理关闭Matplotlib的图形偶尔原因是“ TypeError:isInstance()”



对于我需要实现可以直观地调整图像对比度的工具所需的项目。最终,我想出了一个解决方案,您可以在这里找到。虽然当然可以在许多层面上改进此工具,但还有一件特别的事情仍然让我感到烦恼。正如我在另一篇文章中指出的那样,有时,关闭窗口时,我会收到以下错误消息:

Exception ignored in: <function WeakMethod.__new__.<locals>._cb at 0x00000193A3D7C7B8>
Traceback (most recent call last):
  File "C:UsersmapfAnaconda3libweakref.py", line 58, in _cb
  File "C:UsersmapfAnaconda3libsite-packagesmatplotlibcbook__init__.py", line 182, in _remove_proxy
  File "C:UsersmapfAnaconda3libweakref.py", line 74, in __eq__
TypeError: isinstance() arg 2 must be a type or tuple of types 

我尽可能地简化了我的程序,以便您仍然会收到错误。这是代码:

import sys
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import 
    FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtWidgets import QDialog, QApplication, QGridLayout

class Figure:
    def __init__(self):
        self.fig, self.ax = plt.subplots()
        self.canvas = FigureCanvas(self.fig)
        self.canvas.setMaximumHeight(100)
        self.fig.canvas.mpl_connect('pick_event', self.on_pick_event)
        self.fig.canvas.mpl_connect(
            'button_release_event', self.on_release_event
        )
        self.fig.canvas.mpl_connect(
            'button_press_event', self.on_button_press_event
        )
        self.fig.canvas.mpl_connect(
            'motion_notify_event', self.on_motion_event
        )
        self.canvas.draw()
    def on_pick_event(self, _):
        # print('picked')
        pass
    def on_button_press_event(self, _):
        # print('pressed')
        pass
    def on_release_event(self, _):
        # print('released')
        pass
    def on_motion_event(self, _):
        # print('moved')
        pass

class MainWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.layout = QGridLayout(self)
        self.image = Figure()
        self.layout.addWidget(self.image.canvas, 1, 0)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    GUI = MainWindow()
    GUI.show()
    sys.exit(app.exec_())

现在,如果我运行代码并简单地将光标运行(或单击几次),然后立即按下" X'button",请立即关闭窗口,我会收到有关每个错误消息其他时间。我已经指出了事件处理连接的原因。每当至少两个连接处于活动状态时,我都可以重现错误。

这是否与事件的处理方式有些重叠有关,也许您使用鼠标关闭窗口这一事实?我真的不明白。

这是一个错误并解决了。

最新更新