Matplotlib 事件处理:他们何时发送 matplotlib 事件以及何时发送 Qt 事件
Posted
技术标签:
【中文标题】Matplotlib 事件处理:他们何时发送 matplotlib 事件以及何时发送 Qt 事件【英文标题】:Matplotlib event handling: when do they send matplotlib events and when Qt events 【发布时间】:2020-01-02 04:15:43 【问题描述】:我正在尝试使用 Pyside2 将 matplotlib 嵌入到 Qt 界面中。我想使用“imshow”来显示可以使用滚轮放大并单击的图像。要连接滚轮和鼠标,我使用的是:
self.fig.canvas.mpl_connect('button_press_event', self.mouseClick)
self.fig.canvas.mpl_connect('scroll_event', self.wheelEvent)
如果对于我使用的事件处理程序:
def wheelEvent(self, event):
print(event)
def mouseClick(self, event):
print(event)
当我运行它,然后滚动并单击时,我得到的输出是:
button_press_event: xy=(94, 199) xydata=(99.99197230814553, 134.93602887023127) button=1 dblclick=False inaxes=AxesSubplot(0.125,0.290018;0.775x0.409964)
<PySide2.QtGui.QWheelEvent object at 0x7f92e3359a50>
所以我的问题是,为什么在一种情况下我会收到 PySide 事件,而在另一种情况下会收到 matplotlib button_press_event
?我期待的是得到scroll_event
。
非常感谢!
【问题讨论】:
【参考方案1】:说明:
wheelEvent 是 QWidget 类的一个方法,当窗口通过 QWheelEvent 获得焦点时,它每次与***交互时都会收到通知,因此从它继承的类也将拥有它,在这种情况下,它们会覆盖它方法,并且您还将它连接到 scroll_event 事件,因此打印 QWheelEvent(在我的情况下,在 Linux 上使用 PySide2 5.14,我会交替接收 QWheelEvent 和 scroll_event)。
解决办法:
不要使用 wheelEvent 方法,而是使用另一个名称的方法:
self.fig.canvas.mpl_connect('button_press_event', self.mouseClick)
self.fig.canvas.mpl_connect('scroll_event', self.mouseWheel)
def mouseWheel(self, event):
print(event)
def mouseClick(self, event):
print(event)
【讨论】:
谢谢!我要花 1e6 年才能弄清楚……以上是关于Matplotlib 事件处理:他们何时发送 matplotlib 事件以及何时发送 Qt 事件的主要内容,如果未能解决你的问题,请参考以下文章
Python-Matplotlib可视化(番外篇)——Matplotlib中的事件处理详解与实战
是否必须以不同的方式处理键盘事件才能在 Matplotlib/PyQt5 中选择事件? [复制]