首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PySide2更新图

PySide2更新图
EN

Stack Overflow用户
提问于 2020-04-28 07:59:24
回答 1查看 352关注 0票数 0

我已经在下面的问题上撞到了墙上好几次了,需要一些新的眼睛来帮助我。

在Qt设计器中,我创建了一个带有QComboBox的选项卡(用于选择一个特性)、一个QPushButton (用于指导该特性的绘图)和一个QWidget (称为mywidget的绘图区域)。整个代码很大程度上来自于在SO上发现的各种代码。

在main.py中,我将QPushButton连接到以下函数(在我的QtApp类中定义):

代码语言:javascript
复制
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的内容。但对于这个问题来说,这似乎太复杂了(?)

有关信息,我导入以下内容:

代码语言:javascript
复制
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)

编辑:这里是最小/改编的完整代码:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2020-06-17 08:17:30

最有可能的问题是,当您在初始运行后运行launchGraph时,函数会在初始运行之后创建另一个ax1f1。因此,最初的一个继续显示,没有错误显示。

在这种情况下,您希望继续使用初始的ax1f1,而不是重新声明另一个。

像这样的事情可以解决这个问题:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61475359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档