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

问题描述 投票:0回答:1

我正在尝试在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类和函数的最佳方法?

python pyqt pyqt5
1个回答
1
投票

正如您所指出的,应该避免使用全局变量(请参见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())
© www.soinside.com 2019 - 2024. All rights reserved.