Matplotlib Button与PyQt5结合无响应的原因及相关疑问
我在使用Matplotlib的自定义Button功能时,单独运行官方示例代码功能正常,但将其与PyQt5结合后出现异常:创建带按钮的PyQt5主窗口,点击主窗口按钮弹出Matplotlib绘图窗口后,绘图窗口中的Matplotlib Button完全失去响应。
示例代码
import sys import matplotlib.pyplot as plt import numpy as np from matplotlib.widgets import Button from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QApplication, QPushButton, QWidget class Index: ind = 0 def __init__(self, l, freqs): self.l = l self.freqs = freqs def next(self, event): self.ind += 1 i = self.ind % len(self.freqs) ydata = np.sin(2 * np.pi * self.freqs[i] * t) self.l.set_ydata(ydata) plt.draw() def prev(self, event): self.ind -= 1 i = self.ind % len(self.freqs) ydata = np.sin(2 * np.pi * self.freqs[i] * t) self.l.set_ydata(ydata) plt.draw() class App(QWidget): def __init__(self): super().__init__() self.title = 'PyQt5 button - pythonspot.com' self.left = 10 self.top = 10 self.width = 320 self.height = 200 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) button = QPushButton('PyQt5 button', self) button.setToolTip('This is an example button') button.move(100, 70) button.clicked.connect(self.on_click) self.show() @pyqtSlot() def on_click(self): freqs = np.arange(2, 20, 3) fig, ax = plt.subplots() fig.subplots_adjust(bottom=0.2) t = np.arange(0.0, 1.0, 0.001) s = np.sin(2 * np.pi * freqs[0] * t) l, = ax.plot(t, s, lw=2) callback = Index(l, freqs) axprev = fig.add_axes([0.7, 0.05, 0.1, 0.075]) axnext = fig.add_axes([0.81, 0.05, 0.1, 0.075]) bnext = Button(axnext, 'Next') bnext.on_clicked(callback.next) bprev = Button(axprev, 'Previous') bprev.on_clicked(callback.prev) plt.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = App() sys.exit(app.exec_())
疑问
- 出现该问题的具体原因是什么?
- 在相关讨论中看到需要将Matplotlib嵌入Qt自定义窗口才能解决,但不理解为何必须这么做,是否有官方文档对此进行说明?
- 测试发现该功能在macOS下正常,但在Linux和Windows下按钮无响应。怀疑这与Qt的
QCoreApplication::exec事件循环已运行有关,但不理解为何Qt的事件循环会影响Matplotlib,Matplotlib的事件信号是否需要注册到PyQt5的事件循环中?
内容的提问来源于stack exchange,提问作者likeyiyy
相关产品推荐
相关产品推荐

