鱼C论坛

 找回密码
 立即注册
查看: 1158|回复: 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原生功能,我在网上找了一个现成代码,采用类的方式撰写。但是我的方法也是一个类 ,不会把两个功能进行整合。真的难啊,想了好久都不能实现。代码在附件里。

本人代码:
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_())
图片1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 04:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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