[PyQt5]打开Excel、CSV,tableWidget转换为dataframe,listWidget添加选项,for循环列表推导式--list/dict

untitled.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(640, 480)
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.pushButton_excel = QtWidgets.QPushButton(Form)
        self.pushButton_excel.setObjectName("pushButton_excel")
        self.horizontalLayout_2.addWidget(self.pushButton_excel)
        self.pushButton_csv = QtWidgets.QPushButton(Form)
        self.pushButton_csv.setObjectName("pushButton_csv")
        self.horizontalLayout_2.addWidget(self.pushButton_csv)
        self.verticalLayout_3.addLayout(self.horizontalLayout_2)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.tableWidget = QtWidgets.QTableWidget(Form)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.verticalLayout_2.addWidget(self.tableWidget)
        self.pushButton_tW2df = QtWidgets.QPushButton(Form)
        self.pushButton_tW2df.setObjectName("pushButton_tW2df")
        self.verticalLayout_2.addWidget(self.pushButton_tW2df)
        self.horizontalLayout.addLayout(self.verticalLayout_2)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.listWidget = QtWidgets.QListWidget(Form)
        self.listWidget.setObjectName("listWidget")
        self.verticalLayout.addWidget(self.listWidget)
        self.pushButton_addLW = QtWidgets.QPushButton(Form)
        self.pushButton_addLW.setObjectName("pushButton_addLW")
        self.verticalLayout.addWidget(self.pushButton_addLW)
        self.pushButton_fL = QtWidgets.QPushButton(Form)
        self.pushButton_fL.setObjectName("pushButton_fL")
        self.verticalLayout.addWidget(self.pushButton_fL)
        self.pushButton_fD = QtWidgets.QPushButton(Form)
        self.pushButton_fD.setObjectName("pushButton_fD")
        self.verticalLayout.addWidget(self.pushButton_fD)
        self.horizontalLayout.addLayout(self.verticalLayout)
        self.horizontalLayout.setStretch(0, 3)
        self.horizontalLayout.setStretch(1, 1)
        self.verticalLayout_3.addLayout(self.horizontalLayout)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton_excel.setText(_translate("Form", "打开Excel"))
        self.pushButton_csv.setText(_translate("Form", "打开CSV"))
        self.pushButton_tW2df.setText(_translate("Form", "tableWidget转换为dataframe"))
        self.pushButton_addLW.setText(_translate("Form", "listWidget添加选项"))
        self.pushButton_fL.setText(_translate("Form", "for循环列表推导式--list"))
        self.pushButton_fD.setText(_translate("Form", "for循环列表推导式--dict"))

主代码: 

import sys
import pandas as pd

from PyQt5.QtWidgets import *

from untitled import Ui_Form


class MyMainWindow(QWidget, Ui_Form):  # 继承 QWidget类和 Ui_Form界面类

    def __init__(self, parent=None):
        super(MyMainWindow, self).__init__(parent)  # 初始化父类
        self.setupUi(self)  # 继承 Ui_Form 界面类

        # 设置选择模式为多选模式
        # self.listWidget.setSelectionMode(QListWidget.ExtendedSelection)
        self.listWidget.setSelectionMode(QAbstractItemView.MultiSelection)

        # ********** 打开Excel
        self.pushButton_excel.clicked.connect(self.openExcel)
        self.pushButton_excel.clicked.connect(self.creatExcelTable)

        # ********** 打开CSV
        self.pushButton_csv.clicked.connect(self.openCSV)
        self.pushButton_csv.clicked.connect(self.creatCsvTable)

        # ********** 将tableWidget转换为dataframe
        self.pushButton_tW2df.clicked.connect(self.tW2df)

        # ********** 设置up_listWidget选项
        self.pushButton_addLW.clicked.connect(self.addlistWidgetItem)

        # ********** for循环列表推导式--list
        self.pushButton_fL.clicked.connect(self.forLoopListDerivationFormula_list)

        # ********** for循环列表推导式--dict
        self.pushButton_fD.clicked.connect(self.forLoopListDerivationFormula_dict)

    # 打开Excel
    def openExcel(self):
        openXlsName = QFileDialog.getOpenFileName(self, '选择Excel文件', '',
                                                  'Excel files(*.xlsx , *.xls)')

        global excelPath

        excelPath = openXlsName[0]
        # print("Excel路径:", excelPath)

    def creatExcelTable(self):
        # print("Excel路径:", excelPath)
        try:
            # 读取Excel,将内容转写进表格
            inputTable = pd.read_excel(excelPath)
            # print(inputTable)

            # 设置表格行数与列数
            inputTableRows = inputTable.shape[0]
            inputTableColunms = inputTable.shape[1]
            # print(inputTableRows)
            # print(inputTableColunms)
            self.tableWidget.setRowCount(inputTableRows)
            self.tableWidget.setColumnCount(inputTableColunms)

            # 表头设置
            inputTableHeader = inputTable.columns.values.tolist()
            # print(inputTableHeader)
            self.tableWidget.setHorizontalHeaderLabels(inputTableHeader)

            for i in range(inputTableRows):
                for j in range(inputTableColunms):
                    self.tableWidget.setItem(i, j, QTableWidgetItem(str(inputTable.iloc[i, j])))

            # 设置表格不可编辑
            self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)

        except Exception as e:
            QMessageBox.critical(self, "错误", f"读取Excel文件时出错。\n{e}")

    # 打开CSV
    def openCSV(self):
        openCsvName = QFileDialog.getOpenFileName(self, '选择CSV文件', '',
                                                  'CSV files(*.csv)')

        global csvPath

        csvPath = openCsvName[0]
        # print("Csv路径:", csvPath)

    def creatCsvTable(self):
        # print("Csv路径:", csvPath)
        try:
            # 读取CSV,将内容转写进表格
            inputTable = pd.read_csv(csvPath)
            # print(inputTable)

            # 设置表格行数与列数
            inputTableRows = inputTable.shape[0]
            inputTableColunms = inputTable.shape[1]
            # print(inputTableRows)
            # print(inputTableColunms)
            self.tableWidget.setRowCount(inputTableRows)
            self.tableWidget.setColumnCount(inputTableColunms)

            # 表头设置
            inputTableHeader = inputTable.columns.values.tolist()
            # print(inputTableHeader)
            self.tableWidget.setHorizontalHeaderLabels(inputTableHeader)

            for i in range(inputTableRows):
                for j in range(inputTableColunms):
                    self.tableWidget.setItem(i, j, QTableWidgetItem(str(inputTable.iloc[i, j])))

            # 设置表格不可编辑
            self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)

        except Exception as e:
            QMessageBox.critical(self, "错误", f"读取CSV文件时出错。\n{e}")

    def addlistWidgetItem(self):
        # 清空选项框(必需)
        self.listWidget.clear()

        # 返回主窗口表格列数
        numberCol = self.tableWidget.columnCount()
        # print(numberCol)
        listWidgeDt = []
        # 获取表格表头内容
        for c in range(numberCol):
            headerItem = self.tableWidget.horizontalHeaderItem(c)
            # print(headerItem)
            if headerItem != None:
                headerText = headerItem.text()
                # print(headerText)
                listWidgeDt.append(headerText)
        # print(listWidgeDt)

        self.listWidget.addItems(listWidgeDt)
        self.listWidget.selectAll()  # 设置全选

    def tableWidget2dataframe(self, tableWidget):
        data = []
        for r in range(self.tableWidget.rowCount()):
            row = []
            for c in range(self.tableWidget.columnCount()):
                item = self.tableWidget.item(r, c)
                if item is not None:
                    row.append(item.text())
                else:
                    row.append('')
            data.append(row)
        df = pd.DataFrame(data)
        return df

    def tW2df(self):
        print(self.tableWidget2dataframe(self.tableWidget))

    def forLoopListDerivationFormula_list(self):
        # 获取选中的文本
        # selectItem = self.listWidget.currentItem()  # 返回选中的项(仅限单选)
        selectItem = self.listWidget.selectedItems()  # 返回一个包含item对象的list对象
        select_item = [i.text() for i in selectItem]
        # print(select_item)

        tb_cols = self.tableWidget.columnCount()
        # 方法一:for循环
        list_c = []
        for i in select_item:
            for c in range(tb_cols):
                if self.tableWidget.horizontalHeaderItem(c).text() == i:
                    # print(c)
                    list_c.append(c)
        print(list_c)
        # 方法二:for循环列表推导式
        list_x = [c for i in select_item for c in range(tb_cols) if
                  self.tableWidget.horizontalHeaderItem(c).text() == i]
        print(list_x)

    def forLoopListDerivationFormula_dict(self):
        # 获取选中的文本
        # selectItem = self.listWidget.currentItem()  # 返回选中的项(仅限单选)
        selectItem = self.listWidget.selectedItems()  # 返回一个包含item对象的list对象
        select_item = [i.text() for i in selectItem]
        # print(select_item)

        tb_cols = self.tableWidget.columnCount()
        dict_x = {c: i for i in select_item for c in range(tb_cols) if
                  self.tableWidget.horizontalHeaderItem(c).text() == i}
        print(dict_x)


if __name__ == '__main__':
    app = QApplication(sys.argv)  # 在 QApplication 方法中使用,创建应用程序对象
    myWin = MyMainWindow()  # 实例化 MyMainWindow 类,创建主窗口
    myWin.show()  # 在桌面显示控件 myWin
    sys.exit(app.exec_())  # 结束进程,退出程序

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值