數據庫查詢系統——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.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 進程控制的相關知識,幫助…