鱼C论坛

 找回密码
 立即注册
查看: 1389|回复: 0

PYQT如何实现多选框操作

[复制链接]
发表于 2022-1-26 21:17:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目前我在实现一个工具属性,就是我们经常用的Excel,VLOOKUP函数的工具版。代码层面,功能已经完全实现,目前的难点是搭建GUI框架,即实现用户相关信息输入。我的小工具主要是实现3个信息输入,主要流程如下。
1、        通过GUI人工点击并传入2个Excel文件对象,目前功能已实现(界面非常简陋,后期需不断完善)。
2、        传入文件对象后,通过pandas读取数据,通过QComboBox单选框输入一个shee名,然后索引到Excel对应sheet的数据。目前已实现。
3、        在步骤2中通过pandas读取Excel文件的标题,生成一个列表。传入一个自定义的控件内,实现复选框并最终多选,然后读取这个控件的内容在生成一个索引列表,(未实现)如下图所示。

4、        最终通过pandas的merge方法通过两个Excel表格的索引列实现,文件查找匹配。未实现。
目前难点:多选框非pyqt原生功能,我在网上找了一个现成代码,采用类的方式撰写。但是我的方法也是一个类 ,不会把两个功能进行整合。真的难啊,想了好久都不能实现。代码在附件里。

本人代码:
  1. import pandas as pd
  2. from PyQt5.Qt import *
  3. from PyQt5.QtGui import *
  4. class Window(QWidget):
  5.     def __init__(self):
  6.         super().__init__()
  7.         self.setWindowTitle("自动")
  8.         self.resize(500, 500)
  9.         #---------------------------
  10.         self.open_file()    #点击的操作-------还没有设置按钮
  11.     def setup_ui(self):
  12.         self.obj = QObject()
  13.         btn = QPushButton(self)
  14.         btn.setText("点击我")
  15.         def cao():
  16.             print("点我嘎哈?")
  17.         btn.clicked.connect(cao)
  18.     def import_date(self,date_1,date_2):
  19.         pass
  20.     def open_file(self):
  21.         源数据路径, Type = QFileDialog.getOpenFileName(self, "打开源数据", "", "*.xlsx;;*.xlsm;;*.xls;;*.csv;;All Files(*)")   #All Files(*)
  22.         目标数据路径, Type = QFileDialog.getOpenFileName(self, "打开目标数据", "", "*.xlsx;;*.xlsm;;*.xls;;*.csv;;All Files(*)")
  23.         while 源数据路径.split('.')[-1]  not in ['xlsx','xlsm','xls','csv'] or 目标数据路径.split('.')[-1]  not in ['xlsx','xlsm','xls','csv']:
  24.             源数据路径, Type = QFileDialog.getOpenFileName(self, "打开源数据", "", "*.xlsx;;*.xlsm;;*.xls;;*.csv;;All Files(*)")
  25.             目标数据路径, Type=QFileDialog.getOpenFileName(self, "打开目标数据", "", "*.xlsx;;*.xlsm;;*.xls;;*.csv;;All Files(*)")
  26.             print(f"查找的文件格式仅支持{['xlsx','xlsm','xls','csv']},如果要退出请连续点击两次取消,或者直接关闭打开页面",1)
  27.             if 源数据路径 =="" and 目标数据路径 =="":
  28.                 break
  29.         # print(源数据路径.split('.')[-1],5)
  30.         # print(目标数据路径.split('.')[-1],6)
  31.         #--------#
  32.         if 源数据路径.split('.')[-1]   in ['xlsx','xlsm','xls','csv'] and 目标数据路径.split('.')[-1]   in ['xlsx','xlsm','xls','csv']:
  33.             print(f"匹配的源数据_{源数据路径.split('/')[-1]}加载中。。。。。。", 2)
  34.             print(f"需要匹配的目标数据_{目标数据路径.split('/')[-1]}加载中。。。。。", 3)
  35.         #----源数据-----
  36.         if 源数据路径.split('.')[-1] in ['xlsx','xlsm','xls']:
  37.             源数据原始数据 = pd.read_excel(源数据路径, sheet_name=None)  # 在框架中让用户自主选择
  38.             print(f"匹配的源数据_{源数据路径.split('/')[-1]}加载完成!!", 4)
  39.             源数据工作簿keys_list = list(源数据原始数据.keys())  # 让用户自己选择那一个sheet表来源列表---源数据工作簿--列表源数据工作簿keys_list
  40.             btn = QPushButton(self)
  41.             btn.move(120, 120)
  42.             btn.setText("测试按钮")
  43.             source_ComboBox_sheet= QComboBox(self)
  44.             source_ComboBox_sheet.move(100, 100)
  45.             source_ComboBox_sheet.addItems(源数据工作簿keys_list)
  46.             def clicked_source_ComboBox_sheet():
  47.                 源数据列表=[]   #源数据存放在此列表第0个元素
  48.                 源数据标题行列表原始=[]     #源数据标题行列表存放在此列表第0个元素
  49.                 print("牛逼")
  50.                 source_keys_list_only=source_ComboBox_sheet.currentText()
  51.                 源数据列表.append(源数据原始数据[source_keys_list_only])
  52.                 源数据标题行列表原始.append(list(源数据列表[0].head(0)))
  53.                 print('9999999牛逼牛逼')
  54.             btn.clicked.connect(clicked_source_ComboBox_sheet)

  55.         elif  源数据路径.split('.')[-1] in ['csv']:
  56.             源数据列表 = []  # 源数据存放在此列表第0个元素
  57.             源数据标题行列表原始 = []  # 源数据标题行列表存放在此列表第0个元素
  58.             源数据列表.append(pd.read_csv(源数据路径,encoding='ansi'))  # 在框架中让用户自主选择
  59.             源数据标题行列表原始.append(list(源数据列表[0].head(0)))
  60.             print(f"匹配的源数据_{源数据路径.split('/')[-1]}加载完成!!", 4)
  61.         else:
  62.             print(f"读取的源数据有误,加载的数据为{['xlsx','xlsm','xls','csv']}")
  63.         #----目标数据------
  64.         if 目标数据路径.split('.')[-1] in ['xlsx','xlsm','xls']:
  65.             目标数据原始数据 = pd.read_excel(目标数据路径, sheet_name=None)  # 在框架中让用户自主选择
  66.             print(f"需要匹配的目标数据_{目标数据路径.split('/')[-1]}加载完成!", 5)
  67.             目标数据工作簿keys_list = list(目标数据原始数据.keys())  # 让用户自己选择那一个sheet表来源列表---源数据工作簿--列表目标数据工作簿keys_list
  68.             btn2 = QPushButton(self)
  69.             btn2.move(320, 120)
  70.             btn2.setText("测试按钮")
  71.             target_ComboBox_sheet=QComboBox(self)
  72.             target_ComboBox_sheet.move(300, 100)
  73.             target_ComboBox_sheet.addItems(目标数据工作簿keys_list)
  74.             def clicked_target_ComboBox_sheet():
  75.                 目标数据列表=[]   #目标数据存放在此列表第0个元素
  76.                 目标数据标题行列表原始=[]     #目标数据标题行列表存放在此列表第0个元素
  77.                 print("牛逼3333")
  78.                 target_keys_list_only=target_ComboBox_sheet.currentText()
  79.                 目标数据列表.append(目标数据原始数据[target_keys_list_only])
  80.                 目标数据标题行列表原始.append(list(目标数据列表[0].head(0)))
  81.             btn2.clicked.connect(clicked_target_ComboBox_sheet)
  82.         elif  目标数据路径.split('.')[-1] in ['csv']:
  83.             目标数据列表 = []  # 目标数据存放在此列表第0个元素
  84.             目标数据标题行列表原始 = []  # 目标数据标题行列表存放在此列表第0个元素
  85.             目标数据 = pd.read_csv(目标数据路径,encoding='ansi')  # 在框架中让用户自主选择
  86.             目标数据列表.append(pd.read_csv(目标数据路径, encoding='ansi'))  # 在框架中让用户自主选择
  87.             目标数据标题行列表原始.append(list(目标数据列表[0].head(0)))
  88.             print(f"需要匹配的目标数据_{目标数据路径.split('/')[-1]}加载完成!", 5)
  89.         else:
  90.             print(f"读取的目标数据有误,加载的数据为{['xlsx','xlsm','xls','csv']}")
  91.         #------目标数据-------


  92. if __name__ == '__main__':
  93.     import sys
  94.     app = QApplication(sys.argv)
  95.     # QWidget控件的父子关系()
  96.     window = Window()
  97.     window.show()
  98.     sys.exit(app.exec_())
复制代码
   



网上的大神代码;
  1. from PyQt5.QtWidgets import QComboBox, QLineEdit, QListWidget, QCheckBox, QListWidgetItem
  2. from PyQt5 import QtWidgets, QtCore
  3. import sys

  4. # items = ['Python', 'R', 'Java', 'C++', 'CSS']
  5. # items = ['FH1', 'FH2', 'FH3', 'FH5', 'FH9', 'FH10', 'HT1', 'HT2', 'HT3', 'HT5', 'HT6', 'HT7', 'LH1', 'LH2', 'LH3', 'ZS1']
  6. items = ['FH1', 'FH2', 'FH3']
  7. class ComboCheckBox(QComboBox):
  8.     def __init__(self, parent, items):  # items==[str,str...]
  9.         super(ComboCheckBox, self).__init__(parent)
  10.         self.items = items
  11.         self.items.insert(0, '全部')
  12.         self.row_num = len(self.items)
  13.         self.selectedrow_num = 0
  14.         self.qCheckBox = []
  15.         self.qLineEdit = QLineEdit()
  16.         self.qLineEdit.setReadOnly(True)
  17.         self.qListWidget = QListWidget()
  18.         self.addQCheckBox(0)
  19.         self.qCheckBox[0].stateChanged.connect(self.All)
  20.         for i in range(1, self.row_num):
  21.             self.addQCheckBox(i)
  22.             self.qCheckBox[i].stateChanged.connect(self.show)
  23.         self.setModel(self.qListWidget.model())
  24.         self.setView(self.qListWidget)
  25.         self.setLineEdit(self.qLineEdit)

  26.     def addQCheckBox(self, i):
  27.         self.qCheckBox.append(QCheckBox())
  28.         qItem = QListWidgetItem(self.qListWidget)
  29.         self.qCheckBox[i].setText(self.items[i])
  30.         self.qListWidget.setItemWidget(qItem, self.qCheckBox[i])

  31.     def getCheckItems(self):
  32.         checkedItems = []
  33.         for i in range(1, self.row_num):
  34.             if self.qCheckBox[i].isChecked() == True:
  35.                 checkedItems.append(self.qCheckBox[i].text())
  36.         self.selectedrow_num = len(checkedItems)
  37.         return checkedItems

  38.     def show(self):
  39.         show = ''
  40.         Outputlist = self.getCheckItems()
  41.         self.qLineEdit.setReadOnly(False)
  42.         self.qLineEdit.clear()
  43.         for i in Outputlist:
  44.             show += i + ';'
  45.         if self.selectedrow_num == 0:
  46.             self.qCheckBox[0].setCheckState(0)
  47.         elif self.selectedrow_num == self.row_num - 1:
  48.             self.qCheckBox[0].setCheckState(2)
  49.         else:
  50.             self.qCheckBox[0].setCheckState(1)
  51.         self.qLineEdit.setText(show)
  52.         self.qLineEdit.setReadOnly(True)

  53.     def All(self, state):
  54.         if state == 2:
  55.             for i in range(1, self.row_num):
  56.                 self.qCheckBox[i].setChecked(True)
  57.         elif state == 1:
  58.             if self.selectedrow_num == 0:
  59.                 self.qCheckBox[0].setCheckState(2)
  60.         elif state == 0:
  61.             self.clear()

  62.     def clear(self):
  63.         for i in range(self.row_num):
  64.             self.qCheckBox[i].setChecked(False)

  65. if __name__ == '__main__':

  66.     app = QtWidgets.QApplication(sys.argv)
  67.     Form = QtWidgets.QWidget()
  68.     comboBox1 = ComboCheckBox(Form, items)
  69.     comboBox1.setGeometry(QtCore.QRect(10, 10, 100, 20))
  70.     comboBox1.setMinimumSize(QtCore.QSize(100, 20))
  71.     # comboBox1.loadItems(items)

  72.     Form.show()
  73.     sys.exit(app.exec_())
复制代码
图片1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-30 09:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表