我已经在下面的问题上撞到了墙上好几次了,需要一些新的眼睛来帮助我。
在Qt设计器中,我创建了一个带有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设计器中(文件main.ui压缩为。( main.py),我放置了:-一个组合框,名为mycb,有两个值: feature1,feature2 -一个按钮,名为graphBtn -一个简单而空的QWidget,称为mywidget。
发布于 2020-06-17 08:17:30
最有可能的问题是,当您在初始运行后运行launchGraph时,函数会在初始运行之后创建另一个ax1f1。因此,最初的一个继续显示,没有错误显示。
在这种情况下,您希望继续使用初始的ax1f1,而不是重新声明另一个。
像这样的事情可以解决这个问题:
def launchGraph(self):
if self.mycb.currrentText() == 'feature1':
df1 = ['some_data'] #data from a data source
else: (#== feature2)
df1 = ['some_other_data'] #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)
try:
self.ax1f1.clear()
except:
self.a1f1 = self.mywidget.figure.add_subplot(111)
self.ax1f1.clear()
self.ax1f1.xaxis.set_major_formatter(mdates.DateFormatter('%b%-y'))
self.ax1f1.plot(df1['x'], df1['y'], linewidth=1, color='blue')
self.ax1f1.set(title='My Little Graph')
self.mywidget.canvas.draw()https://stackoverflow.com/questions/61475359
复制相似问题