PYQT如何实现多选框操作
目前我在实现一个工具属性,就是我们经常用的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(源数据原始数据)
源数据标题行列表原始.append(list(源数据列表.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(源数据列表.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(目标数据原始数据)
目标数据标题行列表原始.append(list(目标数据列表.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(目标数据列表.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==
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.stateChanged.connect(self.All)
for i in range(1, self.row_num):
self.addQCheckBox(i)
self.qCheckBox.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.setText(self.items)
self.qListWidget.setItemWidget(qItem, self.qCheckBox)
def getCheckItems(self):
checkedItems = []
for i in range(1, self.row_num):
if self.qCheckBox.isChecked() == True:
checkedItems.append(self.qCheckBox.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.setCheckState(0)
elif self.selectedrow_num == self.row_num - 1:
self.qCheckBox.setCheckState(2)
else:
self.qCheckBox.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.setChecked(True)
elif state == 1:
if self.selectedrow_num == 0:
self.qCheckBox.setCheckState(2)
elif state == 0:
self.clear()
def clear(self):
for i in range(self.row_num):
self.qCheckBox.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_())
页:
[1]