Закрытие рисунка matplotlib с обработкой событий иногда вызывает «TypeError: isinstance()»

Для проекта мне нужно было реализовать инструмент, который может интуитивно регулировать контрастность изображения. В конце концов, я придумал решение, которое вы можете найти здесь. Хотя этот инструмент, безусловно, можно улучшить на многих уровнях, есть одна вещь, которая меня все еще немного раздражает. Как я указал в другом посте, иногда при закрытии окна я получаю следующее сообщение об ошибке:

Exception ignored in: <function WeakMethod.__new__.<locals>._cb at 0x00000193A3D7C7B8>
Traceback (most recent call last):
  File "C:\Users\mapf\Anaconda3\lib\weakref.py", line 58, in _cb
  File "C:\Users\mapf\Anaconda3\lib\site-packages\matplotlib\cbook\__init__.py", line 182, in _remove_proxy
  File "C:\Users\mapf\Anaconda3\lib\weakref.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», я получаю сообщение об ошибке примерно через раз. Я уже определил причину соединений обработки событий. Мне удалось воспроизвести ошибку, когда активны как минимум два соединения.

Может ли это быть как-то связано с каким-то перекрытием в том, как обрабатываются события, и, может быть, с тем, что вы используете мышь, чтобы закрыть окно? Я действительно не понимаю этого.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это оказалось ошибка и была решена.

Другие вопросы по теме