|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
目前我在实现一个工具属性,就是我们经常用的Excel,VLOOKUP函数的工具版。代码层面,功能已经完全实现,目前的难点是搭建GUI框架,即实现用户相关信息输入。我的小工具主要是实现3个信息输入,主要流程如下。
1、 通过GUI人工点击并传入2个Excel文件对象,目前功能已实现(界面非常简陋,后期需不断完善)。
2、 传入文件对象后,通过pandas读取数据,通过QComboBox单选框输入一个shee名,然后索引到Excel对应sheet的数据。目前已实现。
3、 在步骤2中通过pandas读取Excel文件的标题,生成一个列表。传入一个自定义的控件内,实现复选框并最终多选,然后读取这个控件的内容在生成一个索引列表,(未实现)如下图所示。
4、 最终通过pandas的merge方法通过两个Excel表格的索引列实现,文件查找匹配。未实现。
目前难点:多选框非pyqt原生功能,我在网上找了一个现成代码,采用类的方式撰写。但是我的方法也是一个类 ,不会把两个功能进行整合。真的难啊,想了好久都不能实现。代码在附件里。
本人代码:
- import pandas as pd
- from PyQt5.Qt import *
- from PyQt5.QtGui import *
- class Window(QWidget):
- def __init__(self):
- super().__init__()
- self.setWindowTitle("自动")
- self.resize(500, 500)
- #---------------------------
- self.open_file() #点击的操作-------还没有设置按钮
- def setup_ui(self):
- self.obj = QObject()
- btn = QPushButton(self)
- btn.setText("点击我")
- def cao():
- print("点我嘎哈?")
- btn.clicked.connect(cao)
- def import_date(self,date_1,date_2):
- pass
- def open_file(self):
- 源数据路径, Type = QFileDialog.getOpenFileName(self, "打开源数据", "", "*.xlsx;;*.xlsm;;*.xls;;*.csv;;All Files(*)") #All Files(*)
- 目标数据路径, Type = QFileDialog.getOpenFileName(self, "打开目标数据", "", "*.xlsx;;*.xlsm;;*.xls;;*.csv;;All Files(*)")
- while 源数据路径.split('.')[-1] not in ['xlsx','xlsm','xls','csv'] or 目标数据路径.split('.')[-1] not in ['xlsx','xlsm','xls','csv']:
- 源数据路径, Type = QFileDialog.getOpenFileName(self, "打开源数据", "", "*.xlsx;;*.xlsm;;*.xls;;*.csv;;All Files(*)")
- 目标数据路径, Type=QFileDialog.getOpenFileName(self, "打开目标数据", "", "*.xlsx;;*.xlsm;;*.xls;;*.csv;;All Files(*)")
- print(f"查找的文件格式仅支持{['xlsx','xlsm','xls','csv']},如果要退出请连续点击两次取消,或者直接关闭打开页面",1)
- if 源数据路径 =="" and 目标数据路径 =="":
- break
- # print(源数据路径.split('.')[-1],5)
- # print(目标数据路径.split('.')[-1],6)
- #--------#
- if 源数据路径.split('.')[-1] in ['xlsx','xlsm','xls','csv'] and 目标数据路径.split('.')[-1] in ['xlsx','xlsm','xls','csv']:
- print(f"匹配的源数据_{源数据路径.split('/')[-1]}加载中。。。。。。", 2)
- print(f"需要匹配的目标数据_{目标数据路径.split('/')[-1]}加载中。。。。。", 3)
- #----源数据-----
- if 源数据路径.split('.')[-1] in ['xlsx','xlsm','xls']:
- 源数据原始数据 = pd.read_excel(源数据路径, sheet_name=None) # 在框架中让用户自主选择
- print(f"匹配的源数据_{源数据路径.split('/')[-1]}加载完成!!", 4)
- 源数据工作簿keys_list = list(源数据原始数据.keys()) # 让用户自己选择那一个sheet表来源列表---源数据工作簿--列表源数据工作簿keys_list
- btn = QPushButton(self)
- btn.move(120, 120)
- btn.setText("测试按钮")
- source_ComboBox_sheet= QComboBox(self)
- source_ComboBox_sheet.move(100, 100)
- source_ComboBox_sheet.addItems(源数据工作簿keys_list)
- def clicked_source_ComboBox_sheet():
- 源数据列表=[] #源数据存放在此列表第0个元素
- 源数据标题行列表原始=[] #源数据标题行列表存放在此列表第0个元素
- print("牛逼")
- source_keys_list_only=source_ComboBox_sheet.currentText()
- 源数据列表.append(源数据原始数据[source_keys_list_only])
- 源数据标题行列表原始.append(list(源数据列表[0].head(0)))
- print('9999999牛逼牛逼')
- btn.clicked.connect(clicked_source_ComboBox_sheet)
- elif 源数据路径.split('.')[-1] in ['csv']:
- 源数据列表 = [] # 源数据存放在此列表第0个元素
- 源数据标题行列表原始 = [] # 源数据标题行列表存放在此列表第0个元素
- 源数据列表.append(pd.read_csv(源数据路径,encoding='ansi')) # 在框架中让用户自主选择
- 源数据标题行列表原始.append(list(源数据列表[0].head(0)))
- print(f"匹配的源数据_{源数据路径.split('/')[-1]}加载完成!!", 4)
- else:
- print(f"读取的源数据有误,加载的数据为{['xlsx','xlsm','xls','csv']}")
- #----目标数据------
- if 目标数据路径.split('.')[-1] in ['xlsx','xlsm','xls']:
- 目标数据原始数据 = pd.read_excel(目标数据路径, sheet_name=None) # 在框架中让用户自主选择
- print(f"需要匹配的目标数据_{目标数据路径.split('/')[-1]}加载完成!", 5)
- 目标数据工作簿keys_list = list(目标数据原始数据.keys()) # 让用户自己选择那一个sheet表来源列表---源数据工作簿--列表目标数据工作簿keys_list
- btn2 = QPushButton(self)
- btn2.move(320, 120)
- btn2.setText("测试按钮")
- target_ComboBox_sheet=QComboBox(self)
- target_ComboBox_sheet.move(300, 100)
- target_ComboBox_sheet.addItems(目标数据工作簿keys_list)
- def clicked_target_ComboBox_sheet():
- 目标数据列表=[] #目标数据存放在此列表第0个元素
- 目标数据标题行列表原始=[] #目标数据标题行列表存放在此列表第0个元素
- print("牛逼3333")
- target_keys_list_only=target_ComboBox_sheet.currentText()
- 目标数据列表.append(目标数据原始数据[target_keys_list_only])
- 目标数据标题行列表原始.append(list(目标数据列表[0].head(0)))
- btn2.clicked.connect(clicked_target_ComboBox_sheet)
- elif 目标数据路径.split('.')[-1] in ['csv']:
- 目标数据列表 = [] # 目标数据存放在此列表第0个元素
- 目标数据标题行列表原始 = [] # 目标数据标题行列表存放在此列表第0个元素
- 目标数据 = pd.read_csv(目标数据路径,encoding='ansi') # 在框架中让用户自主选择
- 目标数据列表.append(pd.read_csv(目标数据路径, encoding='ansi')) # 在框架中让用户自主选择
- 目标数据标题行列表原始.append(list(目标数据列表[0].head(0)))
- print(f"需要匹配的目标数据_{目标数据路径.split('/')[-1]}加载完成!", 5)
- else:
- print(f"读取的目标数据有误,加载的数据为{['xlsx','xlsm','xls','csv']}")
- #------目标数据-------
- if __name__ == '__main__':
- import sys
- app = QApplication(sys.argv)
- # QWidget控件的父子关系()
- window = Window()
- window.show()
- sys.exit(app.exec_())
复制代码
网上的大神代码;
- from PyQt5.QtWidgets import QComboBox, QLineEdit, QListWidget, QCheckBox, QListWidgetItem
- from PyQt5 import QtWidgets, QtCore
- import sys
- # items = ['Python', 'R', 'Java', 'C++', 'CSS']
- # items = ['FH1', 'FH2', 'FH3', 'FH5', 'FH9', 'FH10', 'HT1', 'HT2', 'HT3', 'HT5', 'HT6', 'HT7', 'LH1', 'LH2', 'LH3', 'ZS1']
- items = ['FH1', 'FH2', 'FH3']
- class ComboCheckBox(QComboBox):
- def __init__(self, parent, items): # items==[str,str...]
- super(ComboCheckBox, self).__init__(parent)
- self.items = items
- self.items.insert(0, '全部')
- self.row_num = len(self.items)
- self.selectedrow_num = 0
- self.qCheckBox = []
- self.qLineEdit = QLineEdit()
- self.qLineEdit.setReadOnly(True)
- self.qListWidget = QListWidget()
- self.addQCheckBox(0)
- self.qCheckBox[0].stateChanged.connect(self.All)
- for i in range(1, self.row_num):
- self.addQCheckBox(i)
- self.qCheckBox[i].stateChanged.connect(self.show)
- self.setModel(self.qListWidget.model())
- self.setView(self.qListWidget)
- self.setLineEdit(self.qLineEdit)
- def addQCheckBox(self, i):
- self.qCheckBox.append(QCheckBox())
- qItem = QListWidgetItem(self.qListWidget)
- self.qCheckBox[i].setText(self.items[i])
- self.qListWidget.setItemWidget(qItem, self.qCheckBox[i])
- def getCheckItems(self):
- checkedItems = []
- for i in range(1, self.row_num):
- if self.qCheckBox[i].isChecked() == True:
- checkedItems.append(self.qCheckBox[i].text())
- self.selectedrow_num = len(checkedItems)
- return checkedItems
- def show(self):
- show = ''
- Outputlist = self.getCheckItems()
- self.qLineEdit.setReadOnly(False)
- self.qLineEdit.clear()
- for i in Outputlist:
- show += i + ';'
- if self.selectedrow_num == 0:
- self.qCheckBox[0].setCheckState(0)
- elif self.selectedrow_num == self.row_num - 1:
- self.qCheckBox[0].setCheckState(2)
- else:
- self.qCheckBox[0].setCheckState(1)
- self.qLineEdit.setText(show)
- self.qLineEdit.setReadOnly(True)
- def All(self, state):
- if state == 2:
- for i in range(1, self.row_num):
- self.qCheckBox[i].setChecked(True)
- elif state == 1:
- if self.selectedrow_num == 0:
- self.qCheckBox[0].setCheckState(2)
- elif state == 0:
- self.clear()
- def clear(self):
- for i in range(self.row_num):
- self.qCheckBox[i].setChecked(False)
- if __name__ == '__main__':
- app = QtWidgets.QApplication(sys.argv)
- Form = QtWidgets.QWidget()
- comboBox1 = ComboCheckBox(Form, items)
- comboBox1.setGeometry(QtCore.QRect(10, 10, 100, 20))
- comboBox1.setMinimumSize(QtCore.QSize(100, 20))
- # comboBox1.loadItems(items)
- Form.show()
- sys.exit(app.exec_())
复制代码 |
-
|