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