You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib Button与PyQt5结合无响应的原因及相关疑问

问题:PyQt5结合Matplotlib自定义Button时按钮无响应

我在使用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_())

疑问

  1. 出现该问题的具体原因是什么?
  2. 在相关讨论中看到需要将Matplotlib嵌入Qt自定义窗口才能解决,但不理解为何必须这么做,是否有官方文档对此进行说明?
  3. 测试发现该功能在macOS下正常,但在Linux和Windows下按钮无响应。怀疑这与Qt的QCoreApplication::exec事件循环已运行有关,但不理解为何Qt的事件循环会影响Matplotlib,Matplotlib的事件信号是否需要注册到PyQt5的事件循环中?

内容的提问来源于stack exchange,提问作者likeyiyy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:45:55