Не изменяется график 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())