Закрытие фигуры matplotlib с обработкой событий иногда вызывает «TypeError: isinstance ()» - PullRequest
0 голосов
/ 12 марта 2019

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

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».'-кнопка, я получаю сообщение об ошибке каждый раз.Я уже определил причину для соединений обработки событий.Мне удалось воспроизвести ошибку, когда хотя бы два из соединений активны.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...