Я уже довольно давно бьюсь головой об стену по следующей проблеме, и мне нужна пара глаз, чтобы помочь мне.
В 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