• PyQt5快速开发与实战 9.3 Pandas在PyQt中的应用


    PyQt5快速开发与实战

    9. 第9章 PyQt5 扩展应用

    9.3 Pandas在PyQt中的应用

    Pandas是 Python的一个数据分析包,是由AQR Capital Management在2008年4月开发的,并于2009年年底开源,目前由专注于Python数据包开发的PyData开发组继续开发和维护,属于PyData项目的一部分。Pandas最初是被作为金融数据分析工具而开发的,并为时间序列分析提供了很好的支持。从 Pandas 这个名称就可以看出,它是面板数据(Panel Data)和 Python数据分析(Data Analysis)的结合
    在Pandas出现之前,Python数据分析的主力军只有NumPy比较好用;在 Pandas出现之后,它基本上占据了Python数据分析的霸主地位,它在处理基础数据尤其是金融时间序列数据方面非常高效。

    使Pandas与 PyQt结合,最方便的方法就是安装qtpandas模块库。这个模块库帮助我们把Pandas 的数据显示在 QTableWidget上,并自动实现各种QTableWidget的功能,如增加、删除、修改、保存、排序等。这些功能实现起来比较麻烦,但是利用qtpandas,我们就可以无须费力地手动重新实现。

    9.3.1 qtpandas的安装
    1. 安装pandas

      pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
      
      • 1

      在这里插入图片描述

    2. 安装qtpandas

      pip install qtpandas -i https://pypi.tuna.tsinghua.edu.cn/simple
      
      • 1

      在这里插入图片描述

      在这里插入图片描述

      可以看到安装失败了,啊这,开始谷歌…

      https://github.com/draperjames/qtpandas
      
      • 1

      在这里插入图片描述

      下载到本地

      解压

      从虚拟环境切到该目录进行安装

      安装时会卡在一个包,叫

      在这里插入图片描述

      这个时候,请出清华源,先把这个包装了,

      在这里插入图片描述

      再次尝试

      在这里插入图片描述

      没有报错,走下来了

    3. 查看是否安装成功

      在这里插入图片描述

    9.3.2 官方示例

    在这里插入图片描述

    跑一下

    在这里插入图片描述

    报错了

    大佬说原因应该是pandas版本升高了,

    跟着错误找过去

    在这里插入图片描述

    改成这样

    在这里插入图片描述

    再次运行官方示例

    在这里插入图片描述

    很好,又报错了

    改成import *

    在这里插入图片描述

    再次运行

    在这里插入图片描述

    窗口出来了

    又出现了野生的错误

    开始谷歌…

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    再次执行

    在这里插入图片描述

    完美运行

    9.3.3 设置提升的窗口控件

    【解决Qt Designer中没有DataTableWidget和DataFrameModel两个类对应的窗口控件】

    所谓提升的窗口控件,就是指有些窗口控件是用户自己基于PyQt定义的衍生窗口控件,这些窗口控件在Qt Designer中没有直接提供,但是可以通过提升的窗口控件这个功能来实现。具体方法如下:

    在这里插入图片描述

    在这里插入图片描述

    点击添加

    在这里插入图片描述

    提升

    在这里插入图片描述

    在这里插入图片描述

    导出ui转为py

    在这里插入图片描述

    提升的窗口控件是PyQt中非常简单、实用而又强大的功能,利用该功能可以通过Qt Designer来实现PyQt与Python 的一些强大的模块之间的交互功能,可以充分利用PyQt和 Python两者的优点来快速开发程序。

    9.3.4 qtpandas的使用

    UI: Ui_pandas_pyqt.py

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'pandas_pyqt.ui'
    #
    # Created by: PyQt5 UI code generator 5.6
    #
    # WARNING! All changes made in this file will be lost!
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralWidget = QtWidgets.QWidget(MainWindow)
            self.centralWidget.setObjectName("centralWidget")
            self.pushButton = QtWidgets.QPushButton(self.centralWidget)
            self.pushButton.setGeometry(QtCore.QRect(680, 60, 75, 23))
            self.pushButton.setObjectName("pushButton")
            self.pushButton_2 = QtWidgets.QPushButton(self.centralWidget)
            self.pushButton_2.setGeometry(QtCore.QRect(680, 170, 75, 23))
            self.pushButton_2.setObjectName("pushButton_2")
            self.pandastablewidget = DataTableWidget(self.centralWidget)
            self.pandastablewidget.setGeometry(QtCore.QRect(10, 30, 591, 331))
            self.pandastablewidget.setStyleSheet("")
            self.pandastablewidget.setObjectName("pandastablewidget")
            MainWindow.setCentralWidget(self.centralWidget)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.pushButton.setText(_translate("MainWindow", "数据初始化"))
            self.pushButton_2.setText(_translate("MainWindow", "保存数据"))
    
    from qtpandas.views.DataTableView import DataTableWidget
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    pandas_pyqt.py

    # -*- coding: utf-8 -*-
    
    """
    Module implementing MainWindow.
    """
    
    from PyQt5.QtCore import pyqtSlot
    from PyQt5.QtWidgets import QMainWindow, QApplication
    
    from Ui_pandas_pyqt import Ui_MainWindow
    
    from qtpandas.models.DataFrameModel import DataFrameModel
    import pandas as pd
    
    class MainWindow(QMainWindow, Ui_MainWindow):
        """
        Class documentation goes here.
        """
        def __init__(self, parent=None):
            """
            Constructor
            
            @param parent reference to the parent widget
            @type QWidget
            """
            super(MainWindow, self).__init__(parent)
            self.setupUi(self)
            
            '''初始化pandasqt'''
            widget = self.pandastablewidget
            widget.resize(600, 500) # 如果对部件尺寸大小不满意可以在这里设置
            
            
            self.model = DataFrameModel() # 设置新的模型
            widget.setViewModel(self.model)
        
            self.df = pd.read_excel(r'data/fund_data.xlsx')
            self.df_original = self.df.copy() # 备份原始数据
            self.model.setDataFrame(self.df)
    
    
        
        @pyqtSlot()
        def on_pushButton_clicked(self):
            """
            初始化pandas
            """
            self.model.setDataFrame(self.df_original)
        
        @pyqtSlot()
        def on_pushButton_2_clicked(self):
            """
            保存数据
            """
            self.df.to_excel(r'data/fund_data_new.xlsx')
           
    
    if __name__ == "__main__":
        import sys
        from pyqt5_plugins.examples.exampleqmlitem import QtCore
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
        app = QApplication(sys.argv)
        ui = MainWindow()
        ui.show()
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    运行

    在这里插入图片描述

    通过窗口更改数据,查看原来的Excel表格数据,即“new”中的。

    在这里插入图片描述

  • 相关阅读:
    完整数字华容道04:游戏主体逻辑
    vue Sts认证后直传图片到阿里云OSS
    python多线程与多进程
    Mybatis概述
    Factors to Consider in Long-Term Planning and Decision-Making in Gaming
    选择合适的外贸公司邮箱注册服务提供商
    MacOS Catalina 从源码构建Qt6.2开发库之01: 编译Qt6.2源代码
    vue computed和watch的区别 v-if和v-show的区别 v-if和v-for优先级的问题
    ATM机模拟系统
    Java面试复习体系总结(2021版,持续更新)
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/126073987