如何在PyQt5中的Ui和类之间交换数据?

2024-10-01 19:30:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在PyQt中实现一个GUI以进行数据分析。基本上,它允许用户浏览数据的位置,并在嵌入式matplotlib环境中绘制数据。这就是我目前掌握的代码

from PyQt5 import uic, QtWidgets

import sys
import pandas as pd
import singlecurve as sc
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
dfG = []


class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi('gui.ui', self)

        self.LoadData.clicked.connect(self.getfiles)
        self.LoadDataB.clicked.connect(self.getfiles)

        GraphArea = PlotCanvas(self, width = 9, height = 7)
        GraphArea.move(0,20)
        self.ExperimentNumber.valueChanged.connect(lambda: GraphArea.plot(self.ExperimentNumber.value(), self.Smoothing.value()))
        self.Smoothing.valueChanged.connect(lambda: GraphArea.plot(self.ExperimentNumber.value(), self.Smoothing.value()))      
        self.readyArea.setStyleSheet("background-color: yellow")
        self.readyArea.setText("No Data")

    def getfiles(self):
        fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file', "/Users/03abc/Desktop/python", '*.xlsm *.xls *.xlsx')
        df = pd.read_excel(fileName)
        global dfG
        dfG = df
        self.readyArea.setStyleSheet("background-color: green")
        self.readyArea.setText("Ready")      


class PlotCanvas(FigureCanvas):

    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)

        FigureCanvas.__init__(self, fig)
        self.setParent(parent)




    def plot(self, data, smoothing):

        data =  sc.MovingMedianCalculator(dfG.iloc[:,data], smoothing)
        print(data)
        print("lado")

        #data = [10,20,20,50,70,90 ]
        #data = [random.random() for i in range (10) ]
        self.figure.clear()
        ax = self.figure.add_subplot(111)
        ax.plot( data, 'r-')
        ax.margins(0, 0.05)
        #ax.set_title('PyQt Matplotlib Example')
        self.draw()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Ui()
    window.show()
    sys.exit(app.exec_())  

我使用一个全局变量在Ui类和Plotcanvas类之间交换数据。从我的C语言编程中,我知道如果可能的话,应该避免使用全局变量。python中似乎也是如此。一个按钮已经实现,通过点击它,用户可以浏览并选择他们想要的数据集。然后修改该数据。但我似乎不明白,让从Ui获得的数据可用于其他python类和函数的最佳方法是什么


Tags: 数据importselfuidataplotinitvalue
1条回答
网友
1楼 · 发布于 2024-10-01 19:30:41

正如您所指出的,您应该避免使用globale变量(参见Why are global variables evil?),在您的情况下,它也是不必要的,因为它足以将信息保存在类的属性中

class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        self.dfG = pd.DataFrame()

        uic.loadUi("gui.ui", self)

        self.LoadData.clicked.connect(self.getfiles)
        self.LoadDataB.clicked.connect(self.getfiles)

        self.graphArea = PlotCanvas(self, width=9, height=7)
        self.graphArea.move(0, 20)
        self.ExperimentNumber.valueChanged.connect(self.onvalueChanged)
        self.Smoothing.valueChanged.connect(self.onvalueChanged)
        self.readyArea.setStyleSheet("background-color: yellow")
        self.readyArea.setText("No Data")

    def getfiles(self):
        fileName, _ = QtWidgets.QFileDialog.getOpenFileName(
            self, "Open file", "/Users/03abc/Desktop/python", "*.xlsm *.xls *.xlsx"
        )
        if fileName:
            self.dfG = pd.read_excel(fileName)
            self.readyArea.setStyleSheet("background-color: green")
            self.readyArea.setText("Ready")

    def onvalueChanged(self):
        self.graphArea.plot(self.dfG, self.Smoothing.value())

相关问题 更多 >

    热门问题