一、引言

数据库查询系统处处存在,在教育信息化背景下,数据库查询技术更已深度融入教务管理场景。本系统采用轻量化架构,结合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.translateForm.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 sys
from jiemian import *
from PyQt5.QtWidgets import QApplication, QWidget
import pandas as pd
from openpyxl import Workbook
# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.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 = Falseself.xueke_flag = Falseself.gaosan = []self.gaoer = []self.gaoyi = []

主要将pushbutton以及combobox绑定于对应的信号函数jiaoshi_flagxueke_flag分别作为是否上传教师表和学科表的标志位;三个列表分别用于存储从excel文件中获取对应年级下的班级序号信息。

3.模板文件设置及下载

    def xiazai(self):wb = Workbook()ws = wb.activews.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+1wb.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 = Truefor 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 = ibreakkecheng = 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:# 获取原始dfyuanshi_df = pd.read_excel(filepath)if not yuanshi_df.empty:QtWidgets.QMessageBox.information(None, "成功", "模板上传成功!")return yuanshi_dfelse:QtWidgets.QMessageBox.critical(None, "提示", "请检查操作步骤或模板文件!")else:QtWidgets.QMessageBox.critical(None, "提示", "请选择XLSX工作表类型!")return pd.DataFrame()

需要上传两个模板文件,直接调用此函数即可。

def cal_lieci(xingqi, jieci):match xingqi:case '星期一':xingqishu = 1case '星期二':xingqishu = 2case '星期三':xingqishu = 3case '星期四':xingqishu = 4case '星期五':xingqishu = 5case '星期六':xingqishu = 6match jieci:case '第1节':jiecishu = 1case '第2节':jiecishu = 2case '第3节':jiecishu = 3case '第4节':jiecishu = 4case '第5节':jiecishu = 5case '第6节':jiecishu = 6case '第7节':jiecishu = 7case '第8节':jiecishu = 8return jiecishu+1+(xingqishu-1)*8

通过match......case语句,将选项内的字符串转换为对应的数字,再根据用户输入返回对应的列索引。

四、总程序代码Kebiao_query.py

import sys
from jiemian import *
from PyQt5.QtWidgets import QApplication, QWidget
import pandas as pd
from openpyxl import Workbook
# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.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 = Falseself.xueke_flag = Falseself.gaosan = []self.gaoer = []self.gaoyi = []def xiazai(self):wb = Workbook()ws = wb.activews.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+1wb.save('模板.xlsx')QtWidgets.QMessageBox.information(self, "成功", "模板下载成功,请查看当前目录!")def shangchuan_jiaoshi(self):self.jiaoshi_df = shangchuan()if not self.jiaoshi_df.empty:self.jiaoshi_flag = Truefor 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 = Truedef 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 = ibreakkecheng = 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:# 获取原始dfyuanshi_df = pd.read_excel(filepath)if not yuanshi_df.empty:QtWidgets.QMessageBox.information(None, "成功", "模板上传成功!")return yuanshi_dfelse:QtWidgets.QMessageBox.critical(None, "提示", "请检查操作步骤或模板文件!")else:QtWidgets.QMessageBox.critical(None, "提示", "请选择XLSX工作表类型!")return pd.DataFrame()def cal_lieci(xingqi, jieci):match xingqi:case '星期一':xingqishu = 1case '星期二':xingqishu = 2case '星期三':xingqishu = 3case '星期四':xingqishu = 4case '星期五':xingqishu = 5case '星期六':xingqishu = 6match jieci:case '第1节':jiecishu = 1case '第2节':jiecishu = 2case '第3节':jiecishu = 3case '第4节':jiecishu = 4case '第5节':jiecishu = 5case '第6节':jiecishu = 6case '第7节':jiecishu = 7case '第8节':jiecishu = 8return jiecishu+1+(xingqishu-1)*8if __name__ == '__main__':app = QApplication(sys.argv)w = mainwindow()w.show()sys.exit(app.exec_())

欢迎留言/私信沟通交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90551.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90551.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/90551.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

base64魔改算法 | jsvmp日志分析并还原

前言 上一篇我们讲了标准 base64 算法还原,为了进一步学习 base64 算法特点,本文将结合 jsvmp 日志,实战还原出 base64 魔改算法。 为了方便大家学习,我将入参和上篇文章一样,入参为 Hello, World!。 插桩 在js代码中&…

vue3笔记(2)自用

目录 一、作用域插槽 二、pinia的使用 一、Pinia 基本概念与用法 1. 安装与初始化 2. 创建 Store 3. 在组件中使用 Store 4. 高级用法 5、storeToRefs 二、Pinia 与 Vuex 的主要区别 三、为什么选择 Pinia? 三、定义全局指令 1.封装通用 DOM 操作&#…

大模型面试回答,介绍项目

1. 模型准备与转换(PC端/服务器)你先在PC上下载或训练好大语言模型(如HuggingFace格式)。用RKLLM-Toolkit把模型转换成瑞芯微NPU能用的专用格式(.rkllm),并可选择量化优化。把转换好的模型文件拷…

Oracle 19.20未知BUG导致oraagent进程内存泄漏

故障现象查询操作系统进程的使用排序,这里看到oraagent的物理内存达到16G,远远超过正常环境(正常环境在19.20大概就是100M多一点)[rootorastd tmp]# ./hmem|more PID NAME VIRT(kB) SHARED(kB) R…

尝试几道算法题,提升python编程思维

一、跳跃游戏题目描述: 给定一个非负整数数组 nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例:输入:nums [2,3,1,1,4] → 输出:True输入…

【菜狗处理脏数据】对很多个不同时间序列数据的文件聚类—20250722

目录 具体做法 可视化方法1:PCA降维 可视化方法2、TSNE降维可视化(非线性降维,更适合聚类) 可视化方法3、轮廓系数评判好坏 每个文件有很多行列的信息,每列是一个驾驶相关的数据,需要对这些文件进行聚类…

Qwen-MT:翻得快,译得巧

我们再向大家介绍一位新朋友:机器翻译模型Qwen-MT。开发者朋友们可通过Qwen API(qwen-mt-turbo),来直接体验它又快又准的翻译技能。 本次更新基于强大的 Qwen3 模型,进一步使用超大规模多语言和翻译数据对模型进行训练…

在 OceanBase 中,使用 TO_CHAR 函数 直接转换日期格式,简洁高效的解决方案

SQL语句SELECT TO_CHAR(TO_DATE(your_column, DD-MON-YY), YYYY-MM-DD) AS formatted_date FROM your_table;关键说明:核心函数:TO_DATE(30-三月-15, DD-MON-YY) → 将字符串转为日期类型TO_CHAR(..., YYYY-MM-DD) → 格式化为 2015-03-30处理中文月份&a…

pnpm运行electronic项目报错,npm运行正常。electronic项目打包为exe报错

pnpm运行electronic项目报错 使用 pnpm 运行 electronic 项目报错,npm 运行正常,报错内容如下 error during start dev server and electron app: Error: Electron uninstallat getElectronPath (file:///E:/project/xxx-vue/node_modules/.pnpm/elect…

8️⃣ 高级特性—— 列表生成式

文章目录🧠 总结1. 基本语法2. 加筛选条件🔁 双层循环(全排列)📂 遍历目录🔑 遍历字典🔡 转小写3. if 和 if...else 的区别4. 练习题🧠 总结 特性用法示例基础语法[x for x in iter…

DocC的简单使用

DocC的简单使用 在写3GShare中,由于刚开始使用MVC模式来写东西,对很多东西都不是很熟,经常写着写着就忘了自己在写什么,所以学了一下DocC来加快开发进度 什么是DocC 简单来说,DocC就是更高级的注释,虽然…

深入理解C语言快速排序与自省排序(Introsort)

排序算法是计算机科学中最基础也是最重要的知识之一。快速排序(Quicksort)因其平均时间复杂度为 O(n log n) 而广受欢迎,但在最坏情况下会退化到 O(n)。为了克服这一缺点,自省排序(Introsort) 应运而生&…

C#编程基础:运算符与结构详解

目录 一.关系运算符 常见关系运算符 二.逻辑运算符 常见逻辑运算符 1. 逻辑与(&& 或 and) 2. 逻辑或(|| 或 or) 3. 逻辑非(! 或 not) 运算符优先级 三.if语句 1.c#程序的三大结构 1.顺序…

嵌入式学习-土堆目标检测(3)-day27

再学一个labelme在labelstudio环境中再pip install labelme安装好后直接输入 labelme之后点击保存,选择保存文件地址还有一个就是将labelme的格式转化为yolo格式还是在labelstudio这个环境里面安装pip install labelme2yolo

Qt OpenGL 集成:开发 3D 图形应用

Qt 提供了完善的 OpenGL 集成方案,使开发者能够在 Qt 应用中高效开发 3D 图形应用。通过 Qt 的 OpenGL 模块,可简化 OpenGL 上下文管理、窗口渲染和跨平台适配,同时结合现代 OpenGL 特性(如着色器、顶点缓冲、纹理等)实…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 热词评论查询功能实现

大家好,我是java1234_小锋老师,最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程,持续更新中,计划月底更新完,感谢支持。今天讲解热词评论查询功能实现 视频在线地址&#…

使用 Google Earth 的 DEM — 教程。

数字高程模型 (DEM)描绘了已知高程点之间的表面高程。本教程将向您展示如何使用 Google Earth 的高程数据生成 DEM。在当今世界,DEM 主要用于 GIS 应用。 当然,我们可以从美国地质调查局 (USGS) 网站下载数字高程模型 (DEM)。但如果我们想知道某个地点的…

在 UniApp 中实现中间凸起 TabBar 的完整指南

如何在 UniApp 中设置中间 TabBar 凸起效果 在移动应用开发中,TabBar 是常见的导航组件,而中间凸起的 TabBar 按钮则是一种流行的设计风格,常用于突出重要功能(如发布、拍照等)。UniApp 提供了 midButton 属性&#xf…

微观低代码

今日去深圳的一家工厂给客户做培训,主要培训内容为低代码产品的二开和功能演示。客户使用了20年的ERP和OA系统,目前想对接到低代码平台。客户目前想实现的主要功能是,对接OA的单点登录,把ERP的功能迁移到低代码平台上来工厂规模比…

Linux进程控制:掌握系统的核心脉络

Linux进程控制:掌握系统的核心脉络 在 Linux 系统中,进程控制是系统运行的核心机制之一。无论是日常的命令行操作,还是复杂的后台服务运行,都离不开对进程的管理和控制。本文将深入探讨 Linux 进程控制的相关知识,帮助…