Не изменяется график matplotlib по сигналу valueChanged QSlider

При попытке изменить высоту столбчатого графика matplotlib по сигналу слайдера ничего не происходит.

main.py:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QHBoxLayout, QSlider, QWidget
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('qt5agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg


class Canvas(FigureCanvasQTAgg):
    def __init__(self):
        fig = plt.figure()
        self.ax = fig.add_subplot()
        super(Canvas, self).__init__(fig)


class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.slider = QSlider()
        self.slider.valueChanged.connect(self.move_slider)

        self.canva = Canvas()
        self.bar = self.canva.ax.bar(0, 99)
        
        layout = QHBoxLayout()
        layout.addWidget(self.canva)
        layout.addWidget(self.slider)
        
        cont = QWidget()
        cont.setLayout(layout)

        self.setCentralWidget(cont)

        # self.bar[0].set_height(1)

    def move_slider(self, value):
        self.bar[0].set_height(1)
        print("Slider moved!")
    

app = QApplication(sys.argv)
w = Window()
w.show()
app.exec()

При движении ползунка сообщение в консоль отправляется, а график остается той же высоты.
Причем если изменять высоту через функцию __init__, то каким-то образом это работает.
Не могу понять, в чем проблема?


Ответы (1 шт):

Автор решения: S. Nick

Вызывает методы draw().
Python FigureCanvasQTAgg.draw примеры использования

Установите свои импорты и попробуйте:

import sys
'''
from PyQt6.QtWidgets import QApplication, QMainWindow, QHBoxLayout, QSlider, QWidget
'''
from PyQt5.Qt import *

import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('qt5agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg


class Canvas(FigureCanvasQTAgg):
    def __init__(self):
        fig = plt.figure()
        self.ax = fig.add_subplot()
        super(Canvas, self).__init__(fig)


class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.slider = QSlider()
        self.slider.valueChanged.connect(self.move_slider)

        self.canva = Canvas()
        self.bar = self.canva.ax.bar(0, 99)
        
        layout = QHBoxLayout(self.centralWidget)
        layout.addWidget(self.canva)
        layout.addWidget(self.slider)

        self.bar[0].set_height(0)                                      # +++

    def move_slider(self, value):
#        self.bar[0].set_height(1)
        self.bar[0].set_height(value)                                  # + value
        
        print(f"Slider moved! {value:>2} ---> {self.bar[0]}")
        self.canva.draw()                                              # +++


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec())

введите сюда описание изображения

→ Ссылка