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_()) # 结束进程,退出程序