数据库查询系统——pyqt+python实现Excel内查课
一、引言
数据库查询系统处处存在,在教育信息化背景下,数据库查询技术更已深度融入教务管理场景。本系统采用轻量化架构,结合Excel课表,通过Python+PyQt5实现跨平台桌面应用,以实现简单查课效果。
二、GUI界面设计
使用PyQt5进行界面的搭建,最终界面如下:
1.第一步:下载课表模板
“点击下载”即可,模板设计效果如下:
模板文件(.XLSX)中需要填写的信息有年级(限制为高一/高二/高三)、班级(最好是纯序号,如100)、星期及节次。这里仅截取到“星期三”,模板最终会到星期六;另外,从星期一至星期六,每天均设置有8节课,用下方的1—8表示。
2.第二步:上传课表文件
直接点击上传即可。
这里需要上传两个不同的课表文件:一是教师任课情况(如js.xlsx),二是任教学科情况(如xk.xlsx)。模板不变,还是用步骤一下载的模板,但需要填写的内容不同。表一(如js.xlsx)需要填写对应日、对应节次、对应班级的任课教师姓名,表二(如xk.xlsx)需要填写对应日、对应节次、对应班级的任教学科(如语文、数学、英语等)。填写示例分别如下(仅列举了从星期一至星期四的部分年级下部分班级的任教和任教情况,其余依次类推或CTRL+V):
上传成功后,会有对应的成功提示。
3.第三步:选择查询字段
需要做4个字段选择:分别是年级、班级、星期、节次。
对于年级来说,已经内嵌了三个选项,分别为高一高二和高三(但面向高中);班级选项有些特殊,需要先选择对应的年级,才能出现相应的班级序号,否则仅有“请选择班级”这一个选项;星期是从星期一直至星期六,节次从“第1节”到“第8节”。
4.第四步:显示查询结果
直接点击“开始查询”即可,查询效果如下:先显示任教学科,再紧跟教师姓名。
在第二步导入的时候,可以看到有些班级在对应的节次是可以没课的,所以遇到这种情况时,显示的特殊效果设定如下:
5.异常提示
若未进行相应的操作,跳过某个步骤或直接点击“开始查询”,则会出现以下的异常提示。
5.界面设计jiemian.py
最后附上通过pyuic5产生的GUI界面代码jiemian.py:
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file \'jiemian.ui\'## Created by: PyQt5 UI code generator 5.15.11## 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, QtWidgetsclass Ui_Form(object): def setupUi(self, Form): Form.setObjectName(\"Form\") Form.setEnabled(True) Form.resize(550, 500) Form.setMinimumSize(QtCore.QSize(550, 500)) Form.setMaximumSize(QtCore.QSize(550, 500)) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(\":/image1.png\"), QtGui.QIcon.Normal, QtGui.QIcon.Off) Form.setWindowIcon(icon) self.label_5 = QtWidgets.QLabel(Form) self.label_5.setGeometry(QtCore.QRect(360, 70, 141, 31)) font = QtGui.QFont() font.setFamily(\"Adobe Arabic\") font.setPointSize(16) self.label_5.setFont(font) self.label_5.setObjectName(\"label_5\") self.label_8 = QtWidgets.QLabel(Form) self.label_8.setGeometry(QtCore.QRect(90, 20, 421, 31)) font = QtGui.QFont() font.setFamily(\"Adobe Arabic\") font.setPointSize(18) font.setBold(False) font.setWeight(50) self.label_8.setFont(font) self.label_8.setObjectName(\"label_8\") self.label_10 = QtWidgets.QLabel(Form) self.label_10.setGeometry(QtCore.QRect(440, 60, 71, 51)) self.label_10.setText(\"\") self.label_10.setPixmap(QtGui.QPixmap(\":/image1.png\")) self.label_10.setObjectName(\"label_10\") self.tabWidget = QtWidgets.QTabWidget(Form) self.tabWidget.setGeometry(QtCore.QRect(40, 110, 471, 371)) self.tabWidget.setObjectName(\"tabWidget\") self.tab = QtWidgets.QWidget() self.tab.setObjectName(\"tab\") self.label = QtWidgets.QLabel(self.tab) self.label.setGeometry(QtCore.QRect(30, 20, 271, 16)) self.label.setObjectName(\"label\") self.pushButton = QtWidgets.QPushButton(self.tab) self.pushButton.setGeometry(QtCore.QRect(80, 50, 131, 23)) self.pushButton.setObjectName(\"pushButton\") self.label_2 = QtWidgets.QLabel(self.tab) self.label_2.setGeometry(QtCore.QRect(240, 20, 141, 16)) self.label_2.setObjectName(\"label_2\") self.pushButton_2 = QtWidgets.QPushButton(self.tab) self.pushButton_2.setGeometry(QtCore.QRect(270, 50, 131, 23)) self.pushButton_2.setObjectName(\"pushButton_2\") self.label_3 = QtWidgets.QLabel(self.tab) self.label_3.setGeometry(QtCore.QRect(30, 100, 141, 16)) self.label_3.setObjectName(\"label_3\") self.label_4 = QtWidgets.QLabel(self.tab) self.label_4.setGeometry(QtCore.QRect(90, 140, 161, 16)) self.label_4.setObjectName(\"label_4\") self.lineEdit = QtWidgets.QLineEdit(self.tab) self.lineEdit.setGeometry(QtCore.QRect(270, 140, 111, 20)) self.lineEdit.setObjectName(\"lineEdit\") self.label_6 = QtWidgets.QLabel(self.tab) self.label_6.setGeometry(QtCore.QRect(90, 180, 161, 16)) self.label_6.setObjectName(\"label_6\") self.lineEdit_2 = QtWidgets.QLineEdit(self.tab) self.lineEdit_2.setGeometry(QtCore.QRect(270, 180, 113, 20)) self.lineEdit_2.setObjectName(\"lineEdit_2\") self.label_7 = QtWidgets.QLabel(self.tab) self.label_7.setGeometry(QtCore.QRect(90, 220, 161, 16)) self.label_7.setObjectName(\"label_7\") self.lineEdit_3 = QtWidgets.QLineEdit(self.tab) self.lineEdit_3.setGeometry(QtCore.QRect(270, 220, 113, 20)) self.lineEdit_3.setObjectName(\"lineEdit_3\") self.pushButton_3 = QtWidgets.QPushButton(self.tab) self.pushButton_3.setGeometry(QtCore.QRect(80, 280, 321, 23)) self.pushButton_3.setObjectName(\"pushButton_3\") self.groupBox = QtWidgets.QGroupBox(self.tab) self.groupBox.setGeometry(QtCore.QRect(80, 130, 321, 121)) self.groupBox.setTitle(\"\") self.groupBox.setObjectName(\"groupBox\") self.groupBox.raise_() self.label.raise_() self.pushButton.raise_() self.label_2.raise_() self.pushButton_2.raise_() self.label_3.raise_() self.label_4.raise_() self.lineEdit.raise_() self.label_6.raise_() self.lineEdit_2.raise_() self.label_7.raise_() self.lineEdit_3.raise_() self.pushButton_3.raise_() self.tabWidget.addTab(self.tab, \"\") self.tab_2 = QtWidgets.QWidget() self.tab_2.setObjectName(\"tab_2\") self.label_9 = QtWidgets.QLabel(self.tab_2) self.label_9.setGeometry(QtCore.QRect(90, 180, 161, 16)) self.label_9.setObjectName(\"label_9\") self.label_11 = QtWidgets.QLabel(self.tab_2) self.label_11.setGeometry(QtCore.QRect(240, 20, 141, 16)) self.label_11.setObjectName(\"label_11\") self.label_12 = QtWidgets.QLabel(self.tab_2) self.label_12.setGeometry(QtCore.QRect(90, 220, 161, 16)) self.label_12.setObjectName(\"label_12\") self.label_13 = QtWidgets.QLabel(self.tab_2) self.label_13.setGeometry(QtCore.QRect(90, 260, 161, 16)) self.label_13.setObjectName(\"label_13\") self.pushButton_4 = QtWidgets.QPushButton(self.tab_2) self.pushButton_4.setGeometry(QtCore.QRect(80, 310, 321, 23)) self.pushButton_4.setObjectName(\"pushButton_4\") self.pushButton_5 = QtWidgets.QPushButton(self.tab_2) self.pushButton_5.setGeometry(QtCore.QRect(270, 50, 131, 23)) self.pushButton_5.setObjectName(\"pushButton_5\") self.label_14 = QtWidgets.QLabel(self.tab_2) self.label_14.setGeometry(QtCore.QRect(30, 20, 271, 16)) self.label_14.setObjectName(\"label_14\") self.lineEdit_4 = QtWidgets.QLineEdit(self.tab_2) self.lineEdit_4.setGeometry(QtCore.QRect(270, 180, 111, 20)) self.lineEdit_4.setObjectName(\"lineEdit_4\") self.pushButton_6 = QtWidgets.QPushButton(self.tab_2) self.pushButton_6.setGeometry(QtCore.QRect(80, 50, 131, 23)) self.pushButton_6.setObjectName(\"pushButton_6\") self.lineEdit_5 = QtWidgets.QLineEdit(self.tab_2) self.lineEdit_5.setGeometry(QtCore.QRect(270, 220, 113, 20)) self.lineEdit_5.setObjectName(\"lineEdit_5\") self.lineEdit_6 = QtWidgets.QLineEdit(self.tab_2) self.lineEdit_6.setGeometry(QtCore.QRect(270, 260, 113, 20)) self.lineEdit_6.setObjectName(\"lineEdit_6\") self.label_15 = QtWidgets.QLabel(self.tab_2) self.label_15.setGeometry(QtCore.QRect(30, 130, 141, 16)) self.label_15.setObjectName(\"label_15\") self.groupBox_2 = QtWidgets.QGroupBox(self.tab_2) self.groupBox_2.setGeometry(QtCore.QRect(80, 160, 321, 131)) self.groupBox_2.setTitle(\"\") self.groupBox_2.setObjectName(\"groupBox_2\") self.pushButton_7 = QtWidgets.QPushButton(self.tab_2) self.pushButton_7.setGeometry(QtCore.QRect(270, 90, 131, 23)) self.pushButton_7.setObjectName(\"pushButton_7\") self.groupBox_2.raise_() self.label_9.raise_() self.label_11.raise_() self.label_12.raise_() self.label_13.raise_() self.pushButton_4.raise_() self.pushButton_5.raise_() self.label_14.raise_() self.lineEdit_4.raise_() self.pushButton_6.raise_() self.lineEdit_5.raise_() self.lineEdit_6.raise_() self.label_15.raise_() self.pushButton_7.raise_() self.tabWidget.addTab(self.tab_2, \"\") self.retranslateUi(Form) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate(\"Form\", \"Exam_arrangement\")) self.label_5.setText(_translate(\"Form\", \"Designed By\")) self.label_8.setText(_translate(\"Form\", \"鄂尔多斯市第一中学考试编排系统\")) self.label.setText(_translate(\"Form\", \"一、请下载学生信息模板\")) self.pushButton.setText(_translate(\"Form\", \"点击下载\")) self.label_2.setText(_translate(\"Form\", \"二、请上传学生信息模板\")) self.pushButton_2.setText(_translate(\"Form\", \"点击上传\")) self.label_3.setText(_translate(\"Form\", \"三、请输入编排信息\")) self.label_4.setText(_translate(\"Form\", \"请输入考号前缀(如20251):\")) self.label_6.setText(_translate(\"Form\", \"请输入每个考场的人数:\")) self.label_7.setText(_translate(\"Form\", \"请输入首考场号:\")) self.pushButton_3.setText(_translate(\"Form\", \"开始编排\")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate(\"Form\", \"年级自考\")) self.label_9.setText(_translate(\"Form\", \"请输入考号前缀(如20251):\")) self.label_11.setText(_translate(\"Form\", \"二、请上传学生信息模板\")) self.label_12.setText(_translate(\"Form\", \"请输入每个考场的人数:\")) self.label_13.setText(_translate(\"Form\", \"请输入首考场号:\")) self.pushButton_4.setText(_translate(\"Form\", \"开始编排\")) self.pushButton_5.setText(_translate(\"Form\", \"点击上传高一信息模板\")) self.label_14.setText(_translate(\"Form\", \"一、请下载学生信息模板\")) self.pushButton_6.setText(_translate(\"Form\", \"点击下载\")) self.label_15.setText(_translate(\"Form\", \"三、请输入编排信息\")) self.pushButton_7.setText(_translate(\"Form\", \"点击上传高二信息模板\")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate(\"Form\", \"期中期末\"))import ziyuan_rc
三、主要程序详解
1.导入所需模块
import sysfrom jiemian import *from PyQt5.QtWidgets import QApplication, QWidgetimport pandas as pdfrom openpyxl import Workbook# 保持窗口大小和qtdesigner中的一致from PyQt5 import QtCoreQtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
不懂为啥需要导入Qtcore的,请看一键曝光:Python+PyQt实现的文件目录透视镜。
2.初始化设置
def __init__(self): super(QWidget, self).__init__() self.setupUi(self) self.pushButton_4.clicked.connect(self.xiazai) self.pushButton.clicked.connect(self.shangchuan_jiaoshi) self.pushButton_2.clicked.connect(self.shangchuan_xueke) self.pushButton_3.clicked.connect(self.kaishi) self.comboBox.currentIndexChanged.connect(self.gengxin_nj) self.jiaoshi_flag = False self.xueke_flag = False self.gaosan = [] self.gaoer = [] self.gaoyi = []
主要将pushbutton以及combobox绑定于对应的信号函数;jiaoshi_flag和xueke_flag分别作为是否上传教师表和学科表的标志位;三个列表分别用于存储从excel文件中获取对应年级下的班级序号信息。
3.模板文件设置及下载
def xiazai(self): wb = Workbook() ws = wb.active ws.merge_cells(\"A1:A2\") ws[\'A1\'] = \'年级\' ws.merge_cells(\"B1:B2\") ws[\'B1\'] = \'班级\' ws.merge_cells(\"C1:J1\") ws[\'C1\'] = \'星期一\' ws.merge_cells(\"K1:R1\") ws[\'K1\'] = \'星期二\' ws.merge_cells(\"S1:Z1\") ws[\'S1\'] = \'星期三\' ws.merge_cells(\"AA1:AH1\") ws[\'AA1\'] = \'星期四\' ws.merge_cells(\"AI1:AP1\") ws[\'AI1\'] = \'星期五\' ws.merge_cells(\"AQ1:AX1\") ws[\'AQ1\'] = \'星期六\' # 对星期下的节次进行编号(每个星期下方均设置为1-8) for col in range(3,51): ws.cell(row=2, column=col).value = (col-3)%8+1 wb.save(\'模板.xlsx\') QtWidgets.QMessageBox.information(self, \"成功\", \"模板下载成功,请查看当前目录!\")
merge_cells用于合并指定范围内的单元格;采用取余的方法对合并后的星期单元格下方进行编号(1-8),即从第2行第col列开始,依次从1开始赋值,直至对第2行所有列完成遍历。
4.上传填写后的模板
def shangchuan_jiaoshi(self): self.jiaoshi_df = shangchuan() if not self.jiaoshi_df.empty: self.jiaoshi_flag = True for i in range(1, len(self.jiaoshi_df)): if self.jiaoshi_df.iloc[i,0] == \"高三\": self.gaosan.append(str(int(self.jiaoshi_df.iloc[i,1]))) elif self.jiaoshi_df.iloc[i,0] == \"高二\": self.gaoer.append(str(int(self.jiaoshi_df.iloc[i,1]))) else: self.gaoyi.append(str(int(self.jiaoshi_df.iloc[i,1]))) def shangchuan_xueke(self): self.xueke_df = shangchuan() if not self.xueke_df.empty: self.xueke_flag = True
如若遇到df为空的情况,则标志位不能置为True,而需要提醒用户重新上传模板信息;否则读取两个文件中的任意一个,以获取每个年级包含哪些班级信息并存储在对应的列表中;需要注意:为应对不同数字类型,保险起见,先将其转换为int类型(万一有float类型),再将班级序号转换为str。
5.更新班级combobox_2选项
def gengxin_nj(self): if self.gaoyi and self.gaoer and self.gaosan: if self.comboBox.currentIndex() == 1: self.comboBox_2.clear() self.comboBox_2.addItem(\"请选择班级\") self.comboBox_2.addItems(self.gaoyi) elif self.comboBox.currentIndex() == 2: self.comboBox_2.clear() self.comboBox_2.addItem(\"请选择班级\") self.comboBox_2.addItems(self.gaoer) else: self.comboBox_2.clear() self.comboBox_2.addItem(\"请选择班级\") self.comboBox_2.addItems(self.gaosan) else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请检查操作步骤或模板文件!\")
得到对应年级下的班级序号信息后,根据combobox所选年级信息的不同,在combobox_2中显示的班级序号也需要做到自适应。以combobox的index作为依据,在combobox_2中添加不同的items。但需要注意,每次添加items前,需要将其原有选项清空clear,否则容易造成选项堆叠重复。另外,还需将“请选择班级”始终作为首选项。
6.查询任课课程信息并显示
def kaishi(self): if (self.xueke_flag==True) and (self.jiaoshi_flag==True): if self.comboBox.currentIndex()!=0: if self.comboBox_2.currentIndex()!=0: if self.comboBox_3.currentIndex()!=0: if self.comboBox_4.currentIndex()!=0: # 根据星期和节次确定列索引 xingqi = self.comboBox_3.currentText() jieci = self.comboBox_4.currentText() liesuoyin = cal_lieci(xingqi, jieci) # 根据班级确定行索引 for i in range(1, len(self.xueke_df)): if str(int(self.xueke_df.iloc[i,1])) == self.comboBox_2.currentText(): hangsuoyin = i break kecheng = self.xueke_df.iloc[hangsuoyin,liesuoyin] jiaoshi = self.jiaoshi_df.iloc[hangsuoyin,liesuoyin] if pd.isna(kecheng) or pd.isna(jiaoshi): self.label_3.setText(\"空 无课\") else: self.label_3.setText(kecheng + jiaoshi) else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请选择节次!\") else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请选择星期!\") else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请选择班级!\") else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请选择年级!\") else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请检查操作步骤或模板文件!\")
以xueke_flag和jiaoshi_flag作为标志位,检查是否上传模板文件;依次判断是否选择每个combobox里的对应选项;若均满足,则根据combobox_3和combobox_4的内容传参至cal_lieci自定义函数来确定具体的列索引值;再依据combobox_2的班级选项,通过for循环定位相同班级的行索引,找到后即可退出循环,避免运算复杂度;最后根据得到的行索引和列索引确定在所有combobox下的任课教师jiaoshi和任教课程kecheng的值,并通过label_3显示;但若遇到无课的情况时,即xueke_df和jiaoshi_df为nan时,显示的内容设置为“空 无课”。当然,哪个combobox有问题,则显示不同的对应提示。
6.自定义函数
def shangchuan(): filepath, _ = QtWidgets.QFileDialog.getOpenFileName(None, \"请选择模板\", \"\", \"XLSX工作表 (*.xlsx)\") # 获取文件路径 if filepath: # 获取原始df yuanshi_df = pd.read_excel(filepath) if not yuanshi_df.empty: QtWidgets.QMessageBox.information(None, \"成功\", \"模板上传成功!\") return yuanshi_df else: QtWidgets.QMessageBox.critical(None, \"提示\", \"请检查操作步骤或模板文件!\") else: QtWidgets.QMessageBox.critical(None, \"提示\", \"请选择XLSX工作表类型!\") return pd.DataFrame()
需要上传两个模板文件,直接调用此函数即可。
def cal_lieci(xingqi, jieci): match xingqi: case \'星期一\': xingqishu = 1 case \'星期二\': xingqishu = 2 case \'星期三\': xingqishu = 3 case \'星期四\': xingqishu = 4 case \'星期五\': xingqishu = 5 case \'星期六\': xingqishu = 6 match jieci: case \'第1节\': jiecishu = 1 case \'第2节\': jiecishu = 2 case \'第3节\': jiecishu = 3 case \'第4节\': jiecishu = 4 case \'第5节\': jiecishu = 5 case \'第6节\': jiecishu = 6 case \'第7节\': jiecishu = 7 case \'第8节\': jiecishu = 8 return jiecishu+1+(xingqishu-1)*8
通过match......case语句,将选项内的字符串转换为对应的数字,再根据用户输入返回对应的列索引。
四、总程序代码Kebiao_query.py
import sysfrom jiemian import *from PyQt5.QtWidgets import QApplication, QWidgetimport pandas as pdfrom openpyxl import Workbook# 保持窗口大小和qtdesigner中的一致from PyQt5 import QtCoreQtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)class mainwindow(QWidget, Ui_Form): def __init__(self): super(QWidget, self).__init__() self.setupUi(self) self.pushButton_4.clicked.connect(self.xiazai) self.pushButton.clicked.connect(self.shangchuan_jiaoshi) self.pushButton_2.clicked.connect(self.shangchuan_xueke) self.pushButton_3.clicked.connect(self.kaishi) self.comboBox.currentIndexChanged.connect(self.gengxin_nj) self.jiaoshi_flag = False self.xueke_flag = False self.gaosan = [] self.gaoer = [] self.gaoyi = [] def xiazai(self): wb = Workbook() ws = wb.active ws.merge_cells(\"A1:A2\") ws[\'A1\'] = \'年级\' ws.merge_cells(\"B1:B2\") ws[\'B1\'] = \'班级\' ws.merge_cells(\"C1:J1\") ws[\'C1\'] = \'星期一\' ws.merge_cells(\"K1:R1\") ws[\'K1\'] = \'星期二\' ws.merge_cells(\"S1:Z1\") ws[\'S1\'] = \'星期三\' ws.merge_cells(\"AA1:AH1\") ws[\'AA1\'] = \'星期四\' ws.merge_cells(\"AI1:AP1\") ws[\'AI1\'] = \'星期五\' ws.merge_cells(\"AQ1:AX1\") ws[\'AQ1\'] = \'星期六\' # 对星期下的节次进行编号(1-8) for col in range(3,51): ws.cell(row=2, column=col).value = (col-3)%8+1 wb.save(\'模板.xlsx\') QtWidgets.QMessageBox.information(self, \"成功\", \"模板下载成功,请查看当前目录!\") def shangchuan_jiaoshi(self): self.jiaoshi_df = shangchuan() if not self.jiaoshi_df.empty: self.jiaoshi_flag = True for i in range(1, len(self.jiaoshi_df)): if self.jiaoshi_df.iloc[i,0] == \"高三\": self.gaosan.append(str(int(self.jiaoshi_df.iloc[i,1]))) elif self.jiaoshi_df.iloc[i,0] == \"高二\": self.gaoer.append(str(int(self.jiaoshi_df.iloc[i,1]))) else: self.gaoyi.append(str(int(self.jiaoshi_df.iloc[i,1]))) def shangchuan_xueke(self): self.xueke_df = shangchuan() if not self.xueke_df.empty: self.xueke_flag = True def gengxin_nj(self): if self.gaoyi and self.gaoer and self.gaosan: if self.comboBox.currentIndex() == 1: self.comboBox_2.clear() self.comboBox_2.addItem(\"请选择班级\") self.comboBox_2.addItems(self.gaoyi) elif self.comboBox.currentIndex() == 2: self.comboBox_2.clear() self.comboBox_2.addItem(\"请选择班级\") self.comboBox_2.addItems(self.gaoer) else: self.comboBox_2.clear() self.comboBox_2.addItem(\"请选择班级\") self.comboBox_2.addItems(self.gaosan) else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请检查操作步骤或模板文件!\") def kaishi(self): if (self.xueke_flag==True) and (self.jiaoshi_flag==True): if self.comboBox.currentIndex()!=0: if self.comboBox_2.currentIndex()!=0: if self.comboBox_3.currentIndex()!=0: if self.comboBox_4.currentIndex()!=0: # 根据星期和节次确定列索引 xingqi = self.comboBox_3.currentText() jieci = self.comboBox_4.currentText() liesuoyin = cal_lieci(xingqi, jieci) # 根据班级确定行索引 for i in range(1, len(self.xueke_df)): if str(int(self.xueke_df.iloc[i,1])) == self.comboBox_2.currentText(): hangsuoyin = i break kecheng = self.xueke_df.iloc[hangsuoyin,liesuoyin] jiaoshi = self.jiaoshi_df.iloc[hangsuoyin,liesuoyin] if pd.isna(kecheng) or pd.isna(jiaoshi): self.label_3.setText(\"空 无课\") else: self.label_3.setText(kecheng + jiaoshi) else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请选择节次!\") else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请选择星期!\") else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请选择班级!\") else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请选择年级!\") else: QtWidgets.QMessageBox.critical(self, \"提示\", \"请检查操作步骤或模板文件!\")def shangchuan(): filepath, _ = QtWidgets.QFileDialog.getOpenFileName(None, \"请选择模板\", \"\", \"XLSX工作表 (*.xlsx)\") # 获取文件路径 if filepath: # 获取原始df yuanshi_df = pd.read_excel(filepath) if not yuanshi_df.empty: QtWidgets.QMessageBox.information(None, \"成功\", \"模板上传成功!\") return yuanshi_df else: QtWidgets.QMessageBox.critical(None, \"提示\", \"请检查操作步骤或模板文件!\") else: QtWidgets.QMessageBox.critical(None, \"提示\", \"请选择XLSX工作表类型!\") return pd.DataFrame()def cal_lieci(xingqi, jieci): match xingqi: case \'星期一\': xingqishu = 1 case \'星期二\': xingqishu = 2 case \'星期三\': xingqishu = 3 case \'星期四\': xingqishu = 4 case \'星期五\': xingqishu = 5 case \'星期六\': xingqishu = 6 match jieci: case \'第1节\': jiecishu = 1 case \'第2节\': jiecishu = 2 case \'第3节\': jiecishu = 3 case \'第4节\': jiecishu = 4 case \'第5节\': jiecishu = 5 case \'第6节\': jiecishu = 6 case \'第7节\': jiecishu = 7 case \'第8节\': jiecishu = 8 return jiecishu+1+(xingqishu-1)*8if __name__ == \'__main__\': app = QApplication(sys.argv) w = mainwindow() w.show() sys.exit(app.exec_())
欢迎留言/私信沟通交流!