PySide2 обновляет график - PullRequest
       31

PySide2 обновляет график

0 голосов
/ 28 апреля 2020

Я уже довольно давно бьюсь головой об стену по следующей проблеме, и мне нужна пара глаз, чтобы помочь мне.

В Qt Designer я создал вкладку с QComboBox (для выбора объекта), QPushButton (для инструктирования прорисовки объекта) и QWidget (область построения, называемая mywidget). Весь код в значительной степени основан на различных кодах, найденных в SO.

В main.py я подключил QPushButton к следующей функции (определенной в моем классе QtApp):

def launchGraph(self):
    df1 = ... #data from a data source
    self.mywidget.figure = Figure()
    self.mywidget.canvas = FigureCanvas(self.mywidget.figure)
    self.mywidget.toolbar = NavigationToolbar(self.mywidget.canvas, self)

    self.mywidget.graphLayout = QtWidgets.QVBoxLayout()
    self.mywidget.graphLayout.addWidget(self.mywidget.canvas)
    self.mywidget.graphLayout.addWidget(self.mywidget.toolbar)
    self.mywidget.setLayout(self.mywidget.graphLayout)

    ax1f1 = self.mywidget.figure.add_subplot(111)
    ax1f1.clear()
    ax1f1.xaxis.set_major_formatter(mdates.DateFormatter('%b%-y'))
    ax1f1.plot(df1['x'], df1['y'], linewidth=1, color='blue')
    ax1f1.set(title='My Little Graph')
    self.mywidget.canvas.draw()

Проблема в том, что когда я запустил свое окно, выберите функцию и нажмите кнопку, отображается правильный график. Если я изменил функцию и нажал на кнопку сюжета, ничего не произошло Я распечатал элемент комбинированного списка, и он выводит правильное актуальное значение из комбинированного списка, однако график не заменяется / не обновляется. Я также добавил тест-переменную isgraph и использовал self.mywidget.figure.clear (), но безуспешно. canvas.repaint () также не обновляет график. Такое ощущение, что мне нужно использовать тест-переменную, чтобы проверить, есть ли график или нет, и если да, то мне нужно очистить содержимое mywidget. Но это кажется слишком сложным для этой проблемы (?)

Для информации я импортирую следующее:

from gui import main
from PySide2 import QtWidgets, QtCore, QtGui

from matplotlib.figure import Figure
import matplotlib.dates as mdates
from matplotlib.dates import DateFormatter
from matplotlib.backends.backend_qt5agg import (FigureCanvasQTAgg as FigureCanvas, 
                                                NavigationToolbar2QT as NavigationToolbar)

Редактировать: Вот минимальный / адаптированный полный код:

from gui import main
from PySide2 import QtWidgets, QtCore, QtGui
from matplotlib.figure import Figure
import matplotlib.dates as mdates
from matplotlib.dates import DateFormatter
from matplotlib.backends.backend_qt5agg import (FigureCanvasQTAgg as 
FigureCanvas, NavigationToolbar2QT as NavigationToolbar)

class MyQtApp(main.Ui_MainWindow, QtWidgets.QMainWindow):
    def __init__(self):
        super(MyQtApp, self).__init__()
        self.setupUi(self)

        self.graphBtn.clicked.connect(self.launchGraph)

        self.show()

    def launchGraph(self):
        if self.mycb.currrentText() == 'feature1':
            df1 = ... #data from a data source
        else: (#== feature2)
            df1 = ... #some other data

        self.mywidget.figure = Figure()
        self.mywidget.canvas = FigureCanvas(self.mywidget.figure)
        self.mywidget.toolbar = 
                         NavigationToolbar(self.mywidget.canvas, self)

        self.mywidget.graphLayout = QtWidgets.QVBoxLayout()
        self.mywidget.graphLayout.addWidget(self.mywidget.canvas)
        self.mywidget.graphLayout.addWidget(self.mywidget.toolbar)
        self.mywidget.setLayout(self.mywidget.graphLayout)

        ax = self.mywidget.figure.add_subplot(111)
        ax.clear()
        ax.plot(df1['x'], df1['y'])
        self.mywidget.canvas.draw()

В Qt Designer (файл main.ui преобразован в. Main.py) я поместил: - один комбинированный список, называемый mycb и имеющий 2 значения: [feature1, feature2] - одну кнопку pu sh с именем graphBtn - простой и пустой QWidget с именем mywidget

...