对于我需要实现可以直观地调整图像对比度的工具所需的项目。最终,我想出了一个解决方案,您可以在这里找到。虽然当然可以在许多层面上改进此工具,但还有一件特别的事情仍然让我感到烦恼。正如我在另一篇文章中指出的那样,有时,关闭窗口时,我会收到以下错误消息:
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",请立即关闭窗口,我会收到有关每个错误消息其他时间。我已经指出了事件处理连接的原因。每当至少两个连接处于活动状态时,我都可以重现错误。
这是否与事件的处理方式有些重叠有关,也许您使用鼠标关闭窗口这一事实?我真的不明白。
这是一个错误并解决了。