|
|
"""
|
|
|
|
|
|
代码功能:主界面和功能的设计与实现
|
|
|
"""
|
|
|
|
|
|
# 导入所需模块
|
|
|
import os
|
|
|
from PyQt5 import QtCore, QtWidgets
|
|
|
import sys
|
|
|
import qtawesome
|
|
|
from PyQt5.QtWidgets import *
|
|
|
import pandas as pd
|
|
|
from PyQt5.QtCore import Qt, pyqtSignal, QRect
|
|
|
|
|
|
from AddAdmin import AddAdmin
|
|
|
from EditAdmin import EditAdmin
|
|
|
from sqls import *
|
|
|
from db import *
|
|
|
import Config as C
|
|
|
|
|
|
# 全局变量
|
|
|
header_field = ['全选'] # 表头字段
|
|
|
global all_header_combobox # 用来装行表头所有复选框
|
|
|
global all_class, class_dict, class_dict2
|
|
|
global data_list # 存放数据库数据列表
|
|
|
global activat_menu # 当前激活的菜单按钮
|
|
|
|
|
|
activat_menu = None # 记录当前选中的菜单
|
|
|
|
|
|
|
|
|
# 自定义表头类
|
|
|
class CheckBoxHeader(QHeaderView):
|
|
|
# 自定义 复选框全选信号
|
|
|
select_all_clicked = pyqtSignal(bool)
|
|
|
# 这4个变量控制列头复选框的样式,位置以及大小
|
|
|
_x_offset = 21
|
|
|
_y_offset = 10
|
|
|
_width = 20
|
|
|
_height = 20
|
|
|
|
|
|
def __init__(self, orientation=Qt.Horizontal, parent=None):
|
|
|
super(CheckBoxHeader, self).__init__(orientation, parent)
|
|
|
self.isOn = False # 控制全选
|
|
|
|
|
|
# paintSection 绘制部分,主要用于绘制复选框,主要设置QStyleOptionButton的状态
|
|
|
def paintSection(self, painter, rect, logicalIndex):
|
|
|
painter.save()
|
|
|
super(CheckBoxHeader, self).paintSection(painter, rect, logicalIndex)
|
|
|
painter.restore()
|
|
|
self._y_offset = int((rect.height() - self._width) / 2.)
|
|
|
if logicalIndex == 0:
|
|
|
option = QStyleOptionButton()
|
|
|
option.rect = QRect(rect.x() + self._x_offset, rect.y() + self._y_offset, self._width, self._height)
|
|
|
option.state = QStyle.State_Enabled | QStyle.State_Active
|
|
|
if self.isOn:
|
|
|
option.state |= QStyle.State_On
|
|
|
else:
|
|
|
option.state |= QStyle.State_Off
|
|
|
self.style().drawControl(QStyle.CE_CheckBox, option, painter)
|
|
|
|
|
|
# 覆写鼠标点击事件(点击全选框效果)
|
|
|
def mousePressEvent(self, event):
|
|
|
index = self.logicalIndexAt(event.pos())
|
|
|
if 0 == index:
|
|
|
x = self.sectionPosition(index)
|
|
|
if x + self._x_offset < event.pos().x() < x + self._x_offset + self._width and self._y_offset < event.pos().y() < self._y_offset + self._height:
|
|
|
if self.isOn:
|
|
|
self.isOn = False
|
|
|
print(self.isOn)
|
|
|
else:
|
|
|
self.isOn = True
|
|
|
print(self.isOn)
|
|
|
# 当用户点击了行表头复选框,发射 自定义信号 select_all_clicked()
|
|
|
self.select_all_clicked.emit(self.isOn)
|
|
|
self.updateSection(0)
|
|
|
super(CheckBoxHeader, self).mousePressEvent(event)
|
|
|
|
|
|
# 改变勾选状态
|
|
|
def change_state(self, isOn):
|
|
|
# 如果行表头复选框为勾选状态
|
|
|
if isOn:
|
|
|
# 将所有的复选框都设为勾选状态
|
|
|
for i in all_header_combobox:
|
|
|
i.setCheckState(Qt.Checked)
|
|
|
else:
|
|
|
for i in all_header_combobox:
|
|
|
i.setCheckState(Qt.Unchecked)
|
|
|
|
|
|
|
|
|
# 界面设计与实现
|
|
|
class MainUi(QtWidgets.QMainWindow):
|
|
|
def __init__(self):
|
|
|
super().__init__()
|
|
|
self.init_ui()
|
|
|
|
|
|
# 初始化界面
|
|
|
def init_ui(self):
|
|
|
self.setFixedSize(960, 700)
|
|
|
self.main_widget = QtWidgets.QWidget() # 创建窗口主部件
|
|
|
self.main_layout = QtWidgets.QGridLayout() # 创建主部件的网格布局
|
|
|
self.main_widget.setLayout(self.main_layout) # 设置窗口主部件布局为网格布局
|
|
|
|
|
|
self.left_widget = QtWidgets.QWidget() # 创建左侧部件
|
|
|
self.left_widget.setObjectName('left_widget') # 部件命名,设置样式用
|
|
|
self.left_layout = QtWidgets.QGridLayout() # 创建左侧部件的网格布局层
|
|
|
self.left_widget.setLayout(self.left_layout) # 设置左侧部件布局为网格
|
|
|
self.main_layout.addWidget(self.left_widget, 0, 0, 12, 2) # 左侧部件在第0行第0列,占12行2列
|
|
|
self.setCentralWidget(self.main_widget) # 设置窗口主部件
|
|
|
|
|
|
self.left_label_1 = QtWidgets.QPushButton('欢迎您,' + C.USER[3])
|
|
|
self.left_label_1.setObjectName('left_label')
|
|
|
self.left_label_3 = QtWidgets.QPushButton("个人中心")
|
|
|
self.left_label_3.setObjectName('left_label')
|
|
|
|
|
|
self.left_button_1 = QtWidgets.QPushButton(qtawesome.icon('fa.users', color='white'), "学生管理")
|
|
|
self.left_button_1.setObjectName('left_button')
|
|
|
self.left_button_1.clicked.connect(lambda: self.setRightWidget(C.FLAG_STUDENT))
|
|
|
self.left_button_2 = QtWidgets.QPushButton(qtawesome.icon('fa.id-card', color='white'), "成绩管理")
|
|
|
self.left_button_2.setObjectName('left_button')
|
|
|
self.left_button_2.clicked.connect(lambda: self.setRightWidget(C.FLAG_GRADE))
|
|
|
# 管理员账号
|
|
|
if C.USER[0] == 1:
|
|
|
self.left_button_3 = QtWidgets.QPushButton(qtawesome.icon('fa.institution', color='white'), "班级管理")
|
|
|
self.left_button_3.setObjectName('left_button')
|
|
|
self.left_button_3.clicked.connect(lambda: self.setRightWidget(C.FLAG_CLASS))
|
|
|
self.left_button_4 = QtWidgets.QPushButton(qtawesome.icon('fa.user-secret', color='white'), "角色管理")
|
|
|
self.left_button_4.setObjectName('left_button')
|
|
|
self.left_button_4.clicked.connect(lambda: self.setRightWidget(C.FLAG_ADMIN))
|
|
|
else:
|
|
|
# 表格布局用于占位
|
|
|
self.left_button_3 = QtWidgets.QPushButton()
|
|
|
self.left_button_4 = QtWidgets.QPushButton()
|
|
|
self.left_button_5 = QtWidgets.QPushButton()
|
|
|
self.left_button_6 = QtWidgets.QPushButton()
|
|
|
self.left_button_7 = QtWidgets.QPushButton()
|
|
|
self.left_button_8 = QtWidgets.QPushButton(qtawesome.icon('fa.pencil-square-o', color='white'), "修改资料")
|
|
|
self.left_button_8.setObjectName('left_button')
|
|
|
self.left_button_8.clicked.connect(lambda: self.setRightWidget(C.FLAG_INFO))
|
|
|
self.left_button_9 = QtWidgets.QPushButton(qtawesome.icon('fa.sign-out', color='white'), "退出登录")
|
|
|
self.left_button_9.setObjectName('left_button')
|
|
|
self.left_button_9.clicked.connect(lambda: self.logOut(True))
|
|
|
self.left_xxx = QtWidgets.QPushButton(" ")
|
|
|
|
|
|
self.left_layout.addWidget(self.left_label_1, 1, 0, 1, 3)
|
|
|
self.left_layout.addWidget(self.left_button_1, 2, 0, 1, 3)
|
|
|
self.left_layout.addWidget(self.left_button_2, 3, 0, 1, 3)
|
|
|
self.left_layout.addWidget(self.left_button_3, 4, 0, 1, 3)
|
|
|
self.left_layout.addWidget(self.left_button_4, 6, 0, 1, 3)
|
|
|
self.left_layout.addWidget(self.left_label_3, 8, 0, 1, 3)
|
|
|
self.left_layout.addWidget(self.left_button_8, 9, 0, 1, 3)
|
|
|
self.left_layout.addWidget(self.left_button_9, 10, 0, 1, 3)
|
|
|
self.left_layout.addWidget(self.left_button_5, 11, 0, 1, 3)
|
|
|
self.left_layout.addWidget(self.left_button_6, 12, 0, 1, 3)
|
|
|
self.left_layout.addWidget(self.left_button_7, 7, 0, 1, 3)
|
|
|
|
|
|
# 设置样式
|
|
|
self.left_widget.setStyleSheet('''
|
|
|
QPushButton{border:none;color:white;}
|
|
|
QPushButton#left_label{
|
|
|
border:none;
|
|
|
border-bottom:1px solid white;
|
|
|
padding-bottom:2px;
|
|
|
font-size:16px;
|
|
|
font-weight:500;
|
|
|
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
|
}
|
|
|
QPushButton#left_button{
|
|
|
width:20px;
|
|
|
font-size:15px;
|
|
|
}
|
|
|
QPushButton#left_button:hover{font-weight:700;}
|
|
|
QWidget#left_widget{
|
|
|
background:#607d8b;
|
|
|
border-top:1px solid white;
|
|
|
border-bottom:1px solid white;
|
|
|
border-left:1px solid white;
|
|
|
}
|
|
|
''')
|
|
|
self.right_widget = None
|
|
|
self.setRightWidget()
|
|
|
self.main_layout.setSpacing(0)
|
|
|
|
|
|
# 设置右方显示界面内容布局
|
|
|
def setRightWidget(self, flag=C.FLAG_GRADE):
|
|
|
# 学生管理
|
|
|
if flag == C.FLAG_STUDENT:
|
|
|
self.right_widget = self.student_management()
|
|
|
# 成绩管理
|
|
|
elif flag == C.FLAG_GRADE:
|
|
|
self.right_widget = self.grade_management()
|
|
|
# 班级管理(管理员)
|
|
|
elif flag == C.FLAG_CLASS:
|
|
|
self.right_widget = self.class_management()
|
|
|
# 角色管理(管理员)
|
|
|
elif flag == C.FLAG_ADMIN:
|
|
|
self.right_widget = self.admin_management()
|
|
|
# 修改信息
|
|
|
elif flag == C.FLAG_INFO:
|
|
|
self.right_widget = self.change_info()
|
|
|
|
|
|
# 学生管理界面设计
|
|
|
def student_management(self):
|
|
|
global all_class, class_dict, class_dict2
|
|
|
class_dict = {}
|
|
|
class_dict2 = {}
|
|
|
if self.right_widget:
|
|
|
self.main_layout.removeWidget(self.right_widget) # 移除已有右侧组件
|
|
|
self.setWindowTitle('Python学生管理系统-学生管理')
|
|
|
self.setLeftMenu(self.left_button_1) # 标记选中
|
|
|
self.right_widget = QtWidgets.QWidget() # 创建右侧部件
|
|
|
self.right_widget.setObjectName('right_widget')
|
|
|
self.verticalLayout = QtWidgets.QVBoxLayout()
|
|
|
self.verticalLayout.setObjectName("verticalLayout")
|
|
|
|
|
|
self.right_layout = self.verticalLayout
|
|
|
self.right_widget.setLayout(self.right_layout) # 设置右侧部件布局为网格
|
|
|
|
|
|
self.main_layout.addWidget(self.right_widget, 0, 2, 12, 10) # 右侧部件在第0行第2列,占12行10列
|
|
|
|
|
|
self.widget = QtWidgets.QWidget()
|
|
|
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
|
|
|
self.horizontalLayout.setObjectName("horizontalLayout")
|
|
|
self.label = QtWidgets.QLabel(self.widget)
|
|
|
self.label.setObjectName("label")
|
|
|
self.horizontalLayout.addWidget(self.label)
|
|
|
# 班级列表下拉框
|
|
|
self.cb = QComboBox(self)
|
|
|
# 单个添加条目
|
|
|
self.cb.addItem('All')
|
|
|
# 多个添加条目
|
|
|
all_class = self.getClassList()
|
|
|
print(all_class)
|
|
|
for class_ in all_class:
|
|
|
# 添加班级字典
|
|
|
class_dict[class_[0]] = class_[1]
|
|
|
class_dict2[class_[1]] = class_[0]
|
|
|
self.cb.addItem(str(class_[0]) + '.' + class_[1])
|
|
|
print(class_dict) # 班级字典
|
|
|
print(class_dict2)
|
|
|
# 传递改变条件的信号
|
|
|
self.cb.currentIndexChanged[int].connect(lambda: self.getDataList(C.FLAG_STUDENT)) # 条目发生改变,发射信号,传递条目索引
|
|
|
|
|
|
self.cb.setStyleSheet(''' text-align : center;
|
|
|
height : 30px;
|
|
|
padding-left: 5px;
|
|
|
font : 12px ''')
|
|
|
self.horizontalLayout.addWidget(self.cb)
|
|
|
self.label_2 = QtWidgets.QLabel(self.widget)
|
|
|
self.label_2.setObjectName("label_2")
|
|
|
self.horizontalLayout.addWidget(self.label_2)
|
|
|
# 姓名输入框
|
|
|
self.input_name = QtWidgets.QLineEdit(self.widget)
|
|
|
self.input_name.setObjectName("input_name")
|
|
|
self.horizontalLayout.addWidget(self.input_name)
|
|
|
self.input_name.setStyleSheet(''' height : 30px;
|
|
|
border-style: outset;
|
|
|
padding-left: 5px;
|
|
|
border: 1px solid #ccc;
|
|
|
border-radius: 5px;
|
|
|
font : 12px ''')
|
|
|
# 查询按钮
|
|
|
self.pushButton_2 = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_2.setObjectName("pushButton_2")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_2)
|
|
|
self.pushButton_2.clicked.connect(lambda: self.getDataList(C.FLAG_STUDENT))
|
|
|
self.pushButton_2.setStyleSheet(''' text-align : center;
|
|
|
background-color : #03a9f4;
|
|
|
height : 30px;
|
|
|
width: 50px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
# 空格
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout.addItem(spacerItem)
|
|
|
|
|
|
# 批量删除按钮
|
|
|
self.pushButton_del = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_del.setObjectName("pushButton_del")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_del)
|
|
|
self.pushButton_del.clicked.connect(lambda: self.batchDelete(C.FLAG_STUDENT))
|
|
|
self.pushButton_del.setStyleSheet(''' text-align : center;
|
|
|
background-color : #f44336;
|
|
|
height : 30px;
|
|
|
width: 80px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
# 导入按钮
|
|
|
self.pushButton_3 = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_3.setObjectName("pushButton")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_3)
|
|
|
self.pushButton_3.clicked.connect(lambda: self.open_file(C.FLAG_STUDENT))
|
|
|
self.pushButton_3.setStyleSheet(''' text-align : center;
|
|
|
background-color : #009688;
|
|
|
height : 30px;
|
|
|
width: 50px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
# 导出按钮
|
|
|
self.pushButton = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton.setObjectName("pushButton")
|
|
|
self.horizontalLayout.addWidget(self.pushButton)
|
|
|
self.pushButton.clicked.connect(lambda: self.data_export(C.FLAG_STUDENT))
|
|
|
self.pushButton.setStyleSheet(''' text-align : center;
|
|
|
background-color : #ff9800;
|
|
|
height : 30px;
|
|
|
width: 50px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
# 内容区域
|
|
|
self.verticalLayout.addWidget(self.widget)
|
|
|
self.tableWidget = QtWidgets.QTableWidget()
|
|
|
self.tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
|
|
self.tableWidget.setObjectName("tableWidget")
|
|
|
self.tableWidget.setColumnCount(7)
|
|
|
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(0, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(1, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(2, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(3, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(4, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(5, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(6, item)
|
|
|
self.verticalLayout.addWidget(self.tableWidget)
|
|
|
|
|
|
# 设置显示名
|
|
|
_translate = QtCore.QCoreApplication.translate
|
|
|
self.label.setText(_translate("Form", "班级"))
|
|
|
self.label_2.setText(_translate("Form", "姓名"))
|
|
|
self.pushButton_2.setText(_translate("Form", "查询"))
|
|
|
self.pushButton_del.setText(_translate("Form", "批量删除"))
|
|
|
self.pushButton_3.setText(_translate("Form", "导入"))
|
|
|
self.pushButton.setText(_translate("Form", "导出"))
|
|
|
|
|
|
# 表头内容
|
|
|
item = self.tableWidget.horizontalHeaderItem(1)
|
|
|
item.setText(_translate("Form", "ID"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(2)
|
|
|
item.setText(_translate("Form", "姓名"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(3)
|
|
|
item.setText(_translate("Form", "学号"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(4)
|
|
|
item.setText(_translate("Form", "性别"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(5)
|
|
|
item.setText(_translate("Form", "班级"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(6)
|
|
|
item.setText(_translate("Form", "操作"))
|
|
|
|
|
|
# 选择框
|
|
|
header = CheckBoxHeader() # 实例化自定义表头
|
|
|
self.tableWidget.setHorizontalHeader(header) # 设置表头
|
|
|
header.select_all_clicked.connect(header.change_state) # 行表头复选框单击信号与槽
|
|
|
self.tableWidget.setColumnWidth(0, 50)
|
|
|
self.tableWidget.setColumnWidth(1, 70)
|
|
|
self.tableWidget.setColumnWidth(5, 197)
|
|
|
|
|
|
# 其余列宽设置
|
|
|
self.tableWidget.verticalHeader().setDefaultSectionSize(32)
|
|
|
|
|
|
# 获取数据
|
|
|
self.getDataList(C.FLAG_STUDENT)
|
|
|
return self.right_widget
|
|
|
|
|
|
# 成绩管理界面设计
|
|
|
def grade_management(self):
|
|
|
global all_class, class_dict, class_dict2
|
|
|
class_dict = {}
|
|
|
class_dict2 = {}
|
|
|
if self.right_widget:
|
|
|
self.main_layout.removeWidget(self.right_widget) # 移除已有右侧组件
|
|
|
self.setWindowTitle('Python学生管理系统-成绩管理')
|
|
|
self.setLeftMenu(self.left_button_2)
|
|
|
self.right_widget = QtWidgets.QWidget() # 创建右侧部件
|
|
|
self.right_widget.setObjectName('right_widget')
|
|
|
self.verticalLayout = QtWidgets.QVBoxLayout()
|
|
|
self.verticalLayout.setObjectName("verticalLayout")
|
|
|
|
|
|
self.right_layout = self.verticalLayout
|
|
|
self.right_widget.setLayout(self.right_layout) # 设置右侧部件布局为网格
|
|
|
self.main_layout.addWidget(self.right_widget, 0, 2, 12, 10) # 右侧部件在第0行第2列,占12行10列
|
|
|
|
|
|
self.widget = QtWidgets.QWidget()
|
|
|
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
|
|
|
self.horizontalLayout.setObjectName("horizontalLayout")
|
|
|
self.label = QtWidgets.QLabel(self.widget)
|
|
|
self.label.setObjectName("label")
|
|
|
self.horizontalLayout.addWidget(self.label)
|
|
|
# 班级列表下拉框
|
|
|
self.cb = QComboBox(self)
|
|
|
# 单个添加条目
|
|
|
self.cb.addItem('All')
|
|
|
# 多个添加条目
|
|
|
all_class = self.getClassList()
|
|
|
for class_ in all_class:
|
|
|
# 添加班级字典
|
|
|
class_dict[class_[0]] = class_[1]
|
|
|
class_dict2[class_[1]] = class_[0]
|
|
|
self.cb.addItem(str(class_[0]) + '.' + class_[1])
|
|
|
|
|
|
# 信号
|
|
|
self.cb.currentIndexChanged[int].connect(lambda: self.getDataList(C.FLAG_GRADE)) # 条目发生改变,发射信号,传递条目索引
|
|
|
|
|
|
self.cb.setStyleSheet(''' text-align : center;
|
|
|
height : 30px;
|
|
|
padding-left: 5px;
|
|
|
font : 12px ''')
|
|
|
self.horizontalLayout.addWidget(self.cb)
|
|
|
self.label_2 = QtWidgets.QLabel(self.widget)
|
|
|
self.label_2.setObjectName("label_2")
|
|
|
self.horizontalLayout.addWidget(self.label_2)
|
|
|
|
|
|
# 姓名输入框
|
|
|
self.input_name = QtWidgets.QLineEdit(self.widget)
|
|
|
self.input_name.setObjectName("input_name")
|
|
|
self.horizontalLayout.addWidget(self.input_name)
|
|
|
self.input_name.setStyleSheet(''' height : 30px;
|
|
|
border-style: outset;
|
|
|
padding-left: 5px;
|
|
|
border: 1px solid #ccc;
|
|
|
border-radius: 5px;
|
|
|
font : 12px ''')
|
|
|
# 查询按钮
|
|
|
self.pushButton_2 = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_2.setObjectName("pushButton_2")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_2)
|
|
|
self.pushButton_2.clicked.connect(lambda: self.getDataList(C.FLAG_GRADE))
|
|
|
self.pushButton_2.setStyleSheet(''' text-align : center;
|
|
|
background-color : #03a9f4;
|
|
|
height : 30px;
|
|
|
width: 50px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout.addItem(spacerItem)
|
|
|
|
|
|
# 批量清零按钮
|
|
|
self.pushButton_del = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_del.setObjectName("pushButton_del")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_del)
|
|
|
self.pushButton_del.clicked.connect(lambda: self.batchDelete(C.FLAG_GRADE))
|
|
|
self.pushButton_del.setStyleSheet(''' text-align : center;
|
|
|
background-color : #f44336;
|
|
|
height : 30px;
|
|
|
width: 80px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
# 导入按钮
|
|
|
self.pushButton_3 = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_3.setObjectName("pushButton")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_3)
|
|
|
self.pushButton_3.clicked.connect(lambda: self.open_file(C.FLAG_GRADE))
|
|
|
self.pushButton_3.setStyleSheet(''' text-align : center;
|
|
|
background-color : #009688;
|
|
|
height : 30px;
|
|
|
width: 50px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
# 导出按钮
|
|
|
self.pushButton = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton.setObjectName("pushButton")
|
|
|
self.horizontalLayout.addWidget(self.pushButton)
|
|
|
self.pushButton.clicked.connect(lambda: self.data_export(C.FLAG_GRADE))
|
|
|
self.pushButton.setStyleSheet(''' text-align : center;
|
|
|
background-color : #ff9800;
|
|
|
height : 30px;
|
|
|
width: 50px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
self.verticalLayout.addWidget(self.widget)
|
|
|
self.tableWidget = QtWidgets.QTableWidget()
|
|
|
self.tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
|
|
self.tableWidget.setObjectName("tableWidget")
|
|
|
self.tableWidget.setColumnCount(8)
|
|
|
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(0, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(1, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(2, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(3, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(4, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(5, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(6, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(7, item)
|
|
|
self.verticalLayout.addWidget(self.tableWidget)
|
|
|
|
|
|
_translate = QtCore.QCoreApplication.translate
|
|
|
self.label.setText(_translate("Form", "班级"))
|
|
|
self.label_2.setText(_translate("Form", "姓名"))
|
|
|
self.pushButton_2.setText(_translate("Form", "查询"))
|
|
|
self.pushButton_del.setText(_translate("Form", "批量清零"))
|
|
|
self.pushButton_3.setText(_translate("Form", "导入"))
|
|
|
self.pushButton.setText(_translate("Form", "导出"))
|
|
|
|
|
|
item = self.tableWidget.horizontalHeaderItem(1)
|
|
|
item.setText(_translate("Form", "姓名"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(2)
|
|
|
item.setText(_translate("Form", "学号"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(3)
|
|
|
item.setText(_translate("Form", "语文"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(4)
|
|
|
item.setText(_translate("Form", "数学"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(5)
|
|
|
item.setText(_translate("Form", "英语"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(6)
|
|
|
item.setText(_translate("Form", "总分"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(7)
|
|
|
item.setText(_translate("Form", "操作"))
|
|
|
|
|
|
header = CheckBoxHeader() # 实例化自定义表头
|
|
|
self.tableWidget.setHorizontalHeader(header) # 设置表头
|
|
|
header.select_all_clicked.connect(header.change_state) # 行表头复选框单击信号与槽
|
|
|
self.tableWidget.setColumnWidth(0, 50)
|
|
|
self.tableWidget.setColumnWidth(3, 80)
|
|
|
self.tableWidget.setColumnWidth(4, 80)
|
|
|
self.tableWidget.setColumnWidth(5, 80)
|
|
|
self.tableWidget.setColumnWidth(7, 130)
|
|
|
|
|
|
# 列宽
|
|
|
self.tableWidget.verticalHeader().setDefaultSectionSize(32)
|
|
|
|
|
|
self.getDataList(C.FLAG_GRADE)
|
|
|
return self.right_widget
|
|
|
|
|
|
# 班级管理界面设计
|
|
|
def class_management(self):
|
|
|
global all_class, class_dict, class_dict2
|
|
|
class_dict = {}
|
|
|
class_dict2 = {}
|
|
|
if self.right_widget:
|
|
|
self.main_layout.removeWidget(self.right_widget) # 移除已有右侧组件
|
|
|
self.setWindowTitle('Python学生管理系统-班级管理')
|
|
|
self.setLeftMenu(self.left_button_3)
|
|
|
self.right_widget = QtWidgets.QWidget() # 创建右侧部件
|
|
|
self.right_widget.setObjectName('right_widget')
|
|
|
self.verticalLayout = QtWidgets.QVBoxLayout()
|
|
|
self.verticalLayout.setObjectName("verticalLayout")
|
|
|
|
|
|
self.right_layout = self.verticalLayout
|
|
|
self.right_widget.setLayout(self.right_layout) # 设置右侧部件布局为网格
|
|
|
|
|
|
self.main_layout.addWidget(self.right_widget, 0, 2, 12, 10)
|
|
|
|
|
|
self.widget = QtWidgets.QWidget()
|
|
|
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
|
|
|
self.horizontalLayout.setObjectName("horizontalLayout")
|
|
|
|
|
|
# 新增按钮
|
|
|
self.pushButton_3 = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_3.setObjectName("pushButton")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_3)
|
|
|
self.pushButton_3.clicked.connect(lambda: self.createData(C.FLAG_CLASS))
|
|
|
self.pushButton_3.setStyleSheet(''' text-align : center;
|
|
|
background-color : #009688;
|
|
|
height : 30px;
|
|
|
width: 80px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
self.label_2 = QtWidgets.QLabel(self.widget)
|
|
|
self.label_2.setObjectName("label_2")
|
|
|
self.horizontalLayout.addWidget(self.label_2)
|
|
|
|
|
|
# 班级输入框
|
|
|
self.input_name = QtWidgets.QLineEdit(self.widget)
|
|
|
self.input_name.setObjectName("input_name")
|
|
|
self.horizontalLayout.addWidget(self.input_name)
|
|
|
self.input_name.setStyleSheet(''' height : 30px;
|
|
|
border-style: outset;
|
|
|
padding-left: 5px;
|
|
|
border: 1px solid #ccc;
|
|
|
border-radius: 5px;
|
|
|
font : 12px ''')
|
|
|
# 查询按钮
|
|
|
self.pushButton_2 = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_2.setObjectName("pushButton_2")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_2)
|
|
|
self.pushButton_2.clicked.connect(lambda: self.getDataList(C.FLAG_CLASS, i=-1))
|
|
|
self.pushButton_2.setStyleSheet(''' text-align : center;
|
|
|
background-color : #03a9f4;
|
|
|
height : 30px;
|
|
|
width: 50px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout.addItem(spacerItem)
|
|
|
|
|
|
# 批量删除按钮
|
|
|
self.pushButton_del = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_del.setObjectName("pushButton_del")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_del)
|
|
|
self.pushButton_del.clicked.connect(lambda: self.batchDelete(C.FLAG_CLASS))
|
|
|
self.pushButton_del.setStyleSheet(''' text-align : center;
|
|
|
background-color : #f44336;
|
|
|
height : 30px;
|
|
|
width: 80px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
self.verticalLayout.addWidget(self.widget)
|
|
|
self.tableWidget = QtWidgets.QTableWidget()
|
|
|
self.tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
|
|
self.tableWidget.setObjectName("tableWidget")
|
|
|
self.tableWidget.setColumnCount(4)
|
|
|
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(0, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(1, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(2, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(3, item)
|
|
|
self.verticalLayout.addWidget(self.tableWidget)
|
|
|
|
|
|
_translate = QtCore.QCoreApplication.translate
|
|
|
self.pushButton_3.setText(_translate("Form", "新增班级"))
|
|
|
self.label_2.setText(_translate("Form", "班级"))
|
|
|
self.pushButton_2.setText(_translate("Form", "查询"))
|
|
|
self.pushButton_del.setText(_translate("Form", "批量删除"))
|
|
|
|
|
|
item = self.tableWidget.horizontalHeaderItem(1)
|
|
|
item.setText(_translate("Form", "ID"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(2)
|
|
|
item.setText(_translate("Form", "班级名称"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(2)
|
|
|
item.setText(_translate("Form", "班级名称"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(3)
|
|
|
item.setText(_translate("Form", "操作"))
|
|
|
|
|
|
header = CheckBoxHeader() # 实例化自定义表头
|
|
|
self.tableWidget.setHorizontalHeader(header) # 设置表头
|
|
|
header.select_all_clicked.connect(header.change_state) # 行表头复选框单击信号与槽
|
|
|
self.tableWidget.setColumnWidth(0, 50)
|
|
|
self.tableWidget.setColumnWidth(1, 70)
|
|
|
self.tableWidget.setColumnWidth(2, 510)
|
|
|
|
|
|
self.tableWidget.verticalHeader().setDefaultSectionSize(32)
|
|
|
|
|
|
self.getDataList(C.FLAG_CLASS, i=-1)
|
|
|
return self.right_widget
|
|
|
|
|
|
# 角色管理界面设计
|
|
|
def admin_management(self):
|
|
|
global all_class, class_dict, class_dict2
|
|
|
class_dict = {}
|
|
|
class_dict2 = {}
|
|
|
if self.right_widget:
|
|
|
self.main_layout.removeWidget(self.right_widget) # 移除已有右侧组件
|
|
|
self.setWindowTitle('Python学生管理系统-角色管理')
|
|
|
self.setLeftMenu(self.left_button_4)
|
|
|
self.right_widget = QtWidgets.QWidget() # 创建右侧部件
|
|
|
self.right_widget.setObjectName('right_widget')
|
|
|
self.verticalLayout = QtWidgets.QVBoxLayout()
|
|
|
self.verticalLayout.setObjectName("verticalLayout")
|
|
|
|
|
|
self.right_layout = self.verticalLayout
|
|
|
self.right_widget.setLayout(self.right_layout) # 设置右侧部件布局为网格
|
|
|
|
|
|
self.main_layout.addWidget(self.right_widget, 0, 2, 12, 10)
|
|
|
|
|
|
self.widget = QtWidgets.QWidget()
|
|
|
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
|
|
|
self.horizontalLayout.setObjectName("horizontalLayout")
|
|
|
|
|
|
# 新增按钮
|
|
|
self.pushButton_3 = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_3.setObjectName("pushButton")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_3)
|
|
|
self.pushButton_3.clicked.connect(lambda: self.addAdmin())
|
|
|
self.pushButton_3.setStyleSheet(''' text-align : center;
|
|
|
background-color : #009688;
|
|
|
height : 30px;
|
|
|
width: 80px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
self.label_2 = QtWidgets.QLabel(self.widget)
|
|
|
self.label_2.setObjectName("label_2")
|
|
|
self.horizontalLayout.addWidget(self.label_2)
|
|
|
|
|
|
# 姓名输入框
|
|
|
self.input_name = QtWidgets.QLineEdit(self.widget)
|
|
|
self.input_name.setObjectName("input_name")
|
|
|
self.horizontalLayout.addWidget(self.input_name)
|
|
|
self.input_name.setStyleSheet(''' height : 30px;
|
|
|
border-style: outset;
|
|
|
padding-left: 5px;
|
|
|
border: 1px solid #ccc;
|
|
|
border-radius: 5px;
|
|
|
font : 12px ''')
|
|
|
|
|
|
# 查询按钮
|
|
|
self.pushButton_2 = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_2.setObjectName("pushButton_2")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_2)
|
|
|
self.pushButton_2.clicked.connect(lambda: self.getDataList(C.FLAG_ADMIN, i=-1))
|
|
|
self.pushButton_2.setStyleSheet(''' text-align : center;
|
|
|
background-color : #03a9f4;
|
|
|
height : 30px;
|
|
|
width: 50px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout.addItem(spacerItem)
|
|
|
|
|
|
# 批量删除按钮
|
|
|
self.pushButton_del = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_del.setObjectName("pushButton_del")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_del)
|
|
|
self.pushButton_del.clicked.connect(lambda: self.batchDelete(C.FLAG_ADMIN))
|
|
|
self.pushButton_del.setStyleSheet(''' text-align : center;
|
|
|
background-color : #f44336;
|
|
|
height : 30px;
|
|
|
width: 80px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
self.verticalLayout.addWidget(self.widget)
|
|
|
self.tableWidget = QtWidgets.QTableWidget()
|
|
|
self.tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
|
|
self.tableWidget.setObjectName("tableWidget")
|
|
|
self.tableWidget.setColumnCount(6)
|
|
|
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(0, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(1, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(2, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(3, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(4, item)
|
|
|
item = QtWidgets.QTableWidgetItem()
|
|
|
self.tableWidget.setHorizontalHeaderItem(5, item)
|
|
|
self.verticalLayout.addWidget(self.tableWidget)
|
|
|
|
|
|
_translate = QtCore.QCoreApplication.translate
|
|
|
self.pushButton_3.setText(_translate("Form", "新增角色"))
|
|
|
self.label_2.setText(_translate("Form", "用户名"))
|
|
|
self.pushButton_2.setText(_translate("Form", "查询"))
|
|
|
self.pushButton_del.setText(_translate("Form", "批量删除"))
|
|
|
|
|
|
item = self.tableWidget.horizontalHeaderItem(1)
|
|
|
item.setText(_translate("Form", "ID"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(2)
|
|
|
item.setText(_translate("Form", "用户名"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(3)
|
|
|
item.setText(_translate("Form", "备注"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(4)
|
|
|
item.setText(_translate("Form", "可管理班级"))
|
|
|
item = self.tableWidget.horizontalHeaderItem(5)
|
|
|
item.setText(_translate("Form", "操作"))
|
|
|
|
|
|
header = CheckBoxHeader() # 实例化自定义表头
|
|
|
self.tableWidget.setHorizontalHeader(header) # 设置表头
|
|
|
header.select_all_clicked.connect(header.change_state) # 行表头复选框单击信号与槽
|
|
|
self.tableWidget.setColumnWidth(0, 50)
|
|
|
self.tableWidget.setColumnWidth(1, 70)
|
|
|
self.tableWidget.setColumnWidth(2, 120)
|
|
|
self.tableWidget.setColumnWidth(3, 160)
|
|
|
self.tableWidget.setColumnWidth(4, 240)
|
|
|
|
|
|
self.tableWidget.verticalHeader().setDefaultSectionSize(32)
|
|
|
|
|
|
self.getDataList(C.FLAG_ADMIN, i=-1)
|
|
|
return self.right_widget
|
|
|
|
|
|
# 修改资料界面设计
|
|
|
def change_info(self):
|
|
|
if self.right_widget:
|
|
|
self.main_layout.removeWidget(self.right_widget) # 移除已有右侧组件
|
|
|
self.setWindowTitle('Python学生管理系统-资料修改')
|
|
|
self.setLeftMenu(self.left_button_8)
|
|
|
self.right_widget = QtWidgets.QWidget() # 创建右侧部件
|
|
|
self.right_widget.setObjectName('right_widget')
|
|
|
self.verticalLayout = QtWidgets.QVBoxLayout()
|
|
|
self.verticalLayout.setObjectName("verticalLayout")
|
|
|
self.right_widget.setStyleSheet(''' background-image : url('image/bg.png');
|
|
|
background-position:center;
|
|
|
background-repeat:no-repeat;''')
|
|
|
|
|
|
self.right_layout = self.verticalLayout
|
|
|
self.right_widget.setLayout(self.right_layout) # 设置右侧部件布局为网格
|
|
|
|
|
|
self.main_layout.addWidget(self.right_widget, 0, 2, 12, 10) # 右侧部件在第0行第3列,占8行9列
|
|
|
|
|
|
self.widget = QtWidgets.QWidget()
|
|
|
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
|
|
|
self.horizontalLayout.setObjectName("horizontalLayout")
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
|
|
|
self.label_2 = QtWidgets.QLabel(self.widget)
|
|
|
self.label_2.setObjectName("label_2")
|
|
|
self.horizontalLayout.addItem(spacerItem)
|
|
|
self.horizontalLayout.addWidget(self.label_2)
|
|
|
|
|
|
# 用户名输入框
|
|
|
self.input_name = QtWidgets.QLineEdit(self.widget)
|
|
|
self.input_name.setObjectName("input_name")
|
|
|
self.input_name.setText(C.USER[1])
|
|
|
self.horizontalLayout.addWidget(self.input_name)
|
|
|
self.input_name.setStyleSheet(''' height : 30px;
|
|
|
border-style: outset;
|
|
|
padding-left: 5px;
|
|
|
border: 1px solid #ccc;
|
|
|
border-radius: 5px;
|
|
|
font : 12px ''')
|
|
|
|
|
|
self.widget2 = QtWidgets.QWidget()
|
|
|
self.horizontalLayout2 = QtWidgets.QHBoxLayout(self.widget2)
|
|
|
|
|
|
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout2.addItem(spacerItem2)
|
|
|
self.label_pass0 = QtWidgets.QLabel(self.widget2)
|
|
|
self.label_pass0.setText(' 原密码')
|
|
|
self.horizontalLayout2.addWidget(self.label_pass0)
|
|
|
|
|
|
# 原密码输入框
|
|
|
self.input_pass0 = QtWidgets.QLineEdit(self.widget2)
|
|
|
self.input_pass0.setEchoMode(QtWidgets.QLineEdit.Password)
|
|
|
self.input_pass0.setPlaceholderText('请输入原密码')
|
|
|
self.horizontalLayout2.addWidget(self.input_pass0)
|
|
|
self.input_pass0.setStyleSheet(''' height : 30px;
|
|
|
border-style: outset;
|
|
|
padding-left: 5px;
|
|
|
border: 1px solid #ccc;
|
|
|
border-radius: 5px;
|
|
|
font : 12px ''')
|
|
|
|
|
|
self.widget3 = QtWidgets.QWidget()
|
|
|
self.horizontalLayout3 = QtWidgets.QHBoxLayout(self.widget3)
|
|
|
|
|
|
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout3.addItem(spacerItem3)
|
|
|
self.label_pass1 = QtWidgets.QLabel(self.widget3)
|
|
|
self.label_pass1.setText(' 新密码')
|
|
|
# 新密码输入框
|
|
|
self.input_pass1 = QtWidgets.QLineEdit(self.widget3)
|
|
|
self.input_pass1.setObjectName("input_pass1")
|
|
|
self.input_pass1.setEchoMode(QtWidgets.QLineEdit.Password)
|
|
|
self.input_pass1.setPlaceholderText('请输入新密码')
|
|
|
self.horizontalLayout3.addWidget(self.label_pass1)
|
|
|
self.horizontalLayout3.addWidget(self.input_pass1)
|
|
|
self.input_pass1.setStyleSheet(''' height : 30px;
|
|
|
border-style: outset;
|
|
|
padding-left: 5px;
|
|
|
border: 1px solid #ccc;
|
|
|
border-radius: 5px;
|
|
|
font : 12px ''')
|
|
|
|
|
|
self.widget4 = QtWidgets.QWidget()
|
|
|
self.horizontalLayout4 = QtWidgets.QHBoxLayout(self.widget4)
|
|
|
spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout4.addItem(spacerItem4)
|
|
|
self.label_pass2 = QtWidgets.QLabel(self.widget4)
|
|
|
self.label_pass2.setText('重复密码')
|
|
|
# 重复密码输入框
|
|
|
self.input_pass2 = QtWidgets.QLineEdit(self.widget4)
|
|
|
self.input_pass2.setObjectName("input_pass2")
|
|
|
self.input_pass2.setEchoMode(QtWidgets.QLineEdit.Password)
|
|
|
self.input_pass2.setPlaceholderText('请重复新密码')
|
|
|
self.horizontalLayout4.addWidget(self.label_pass2)
|
|
|
self.horizontalLayout4.addWidget(self.input_pass2)
|
|
|
self.input_pass2.setStyleSheet(''' height : 30px;
|
|
|
border-style: outset;
|
|
|
padding-left: 5px;
|
|
|
border: 1px solid #ccc;
|
|
|
border-radius: 5px;
|
|
|
font : 12px ''')
|
|
|
self.widget5 = QtWidgets.QWidget()
|
|
|
self.horizontalLayout5 = QtWidgets.QHBoxLayout(self.widget5)
|
|
|
spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout5.addItem(spacerItem5)
|
|
|
|
|
|
# 提交按钮
|
|
|
self.pushButton_3 = QtWidgets.QPushButton(self.widget5)
|
|
|
self.pushButton_3.setObjectName("pushButton")
|
|
|
self.horizontalLayout5.addWidget(self.pushButton_3)
|
|
|
self.pushButton_3.clicked.connect(lambda: self.modifyPassw())
|
|
|
self.pushButton_3.setStyleSheet(''' text-align : center;
|
|
|
background-color : #009688;
|
|
|
height : 30px;
|
|
|
width: 80px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
# 修改按钮
|
|
|
self.pushButton_2 = QtWidgets.QPushButton(self.widget)
|
|
|
self.pushButton_2.setObjectName("pushButton_2")
|
|
|
self.horizontalLayout.addWidget(self.pushButton_2)
|
|
|
self.pushButton_2.clicked.connect(lambda: self.editUsername())
|
|
|
self.pushButton_2.setStyleSheet(''' text-align : center;
|
|
|
background-color : #03a9f4;
|
|
|
height : 30px;
|
|
|
width: 50px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout.addItem(spacerItem)
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout2.addItem(spacerItem)
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout3.addItem(spacerItem)
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout4.addItem(spacerItem)
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.horizontalLayout5.addItem(spacerItem)
|
|
|
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 100, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.verticalLayout.addItem(spacerItem)
|
|
|
self.verticalLayout.addWidget(self.widget)
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 300, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.verticalLayout.addItem(spacerItem)
|
|
|
self.verticalLayout.addWidget(self.widget2)
|
|
|
self.verticalLayout.addWidget(self.widget3)
|
|
|
self.verticalLayout.addWidget(self.widget4)
|
|
|
self.verticalLayout.addWidget(self.widget5)
|
|
|
|
|
|
spacerItem = QtWidgets.QSpacerItem(40, 200, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
|
self.verticalLayout.addItem(spacerItem)
|
|
|
|
|
|
_translate = QtCore.QCoreApplication.translate
|
|
|
self.pushButton_3.setText(_translate("Form", "修改密码"))
|
|
|
self.label_2.setText(_translate("Form", "用户名"))
|
|
|
self.pushButton_2.setText(_translate("Form", "修改"))
|
|
|
|
|
|
return self.right_widget
|
|
|
|
|
|
# 设置行可编辑
|
|
|
def editRow(self, id, flag, editable=True):
|
|
|
"""
|
|
|
:param id: 数据库id
|
|
|
:param flag: 1. 学生 2.班级 3.角色
|
|
|
:param editable: 是否设置单元格可编辑,默认true
|
|
|
:return:
|
|
|
"""
|
|
|
button = self.sender()
|
|
|
if button:
|
|
|
# 确定位置的时候这里是关键
|
|
|
row = self.tableWidget.indexAt(button.parent().pos()).row()
|
|
|
FLAGS = QtCore.Qt.ItemIsEnabled
|
|
|
if editable:
|
|
|
FLAGS = QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable | FLAGS
|
|
|
BUTTONS = self.buttonForRowEdit(id, flag)
|
|
|
else:
|
|
|
BUTTONS = self.buttonForRow(id, flag)
|
|
|
|
|
|
if flag == C.FLAG_STUDENT:
|
|
|
item2 = self.tableWidget.item(row, 2)
|
|
|
item2.setFlags(FLAGS)
|
|
|
item2 = self.tableWidget.item(row, 3)
|
|
|
item2.setFlags(FLAGS)
|
|
|
item2 = self.tableWidget.item(row, 4)
|
|
|
item2.setFlags(FLAGS)
|
|
|
item2 = self.tableWidget.item(row, 5)
|
|
|
item2.setFlags(FLAGS)
|
|
|
self.tableWidget.setCellWidget(row, 6, BUTTONS)
|
|
|
elif flag == C.FLAG_GRADE:
|
|
|
item2 = self.tableWidget.item(row, 3)
|
|
|
item2.setFlags(FLAGS)
|
|
|
item2 = self.tableWidget.item(row, 4)
|
|
|
item2.setFlags(FLAGS)
|
|
|
item2 = self.tableWidget.item(row, 5)
|
|
|
item2.setFlags(FLAGS)
|
|
|
self.tableWidget.setCellWidget(row, 7, BUTTONS)
|
|
|
|
|
|
# 提交数据
|
|
|
def submitData(self, id, flag):
|
|
|
"""
|
|
|
:param id: 数据库id
|
|
|
:param flag: 1. 学生 2.班级 3.角色
|
|
|
:return:
|
|
|
"""
|
|
|
global class_dict2
|
|
|
# 调用sender()方法可以判断发送信号的信号源是哪一个
|
|
|
button = self.sender()
|
|
|
if button:
|
|
|
# 确定位置
|
|
|
row = self.tableWidget.indexAt(button.parent().pos()).row()
|
|
|
# 学生管理
|
|
|
if flag == C.FLAG_STUDENT:
|
|
|
name = self.tableWidget.item(row, 2).text()
|
|
|
number = self.tableWidget.item(row, 3).text()
|
|
|
sex = '1' if self.tableWidget.item(row, 4).text() == '男' else '2'
|
|
|
class_ = self.tableWidget.item(row, 5).text()
|
|
|
if class_ not in class_dict2.keys():
|
|
|
QMessageBox.critical(self, '输入有误', "该班级不存在!")
|
|
|
return
|
|
|
else:
|
|
|
try:
|
|
|
class_ = class_dict2[class_]
|
|
|
sql_execute(updateStudentById(id, name, number, sex, class_))
|
|
|
QMessageBox.about(self, '成功', "修改成功!")
|
|
|
self.editRow(id, flag, False)
|
|
|
except Exception as e:
|
|
|
print(e)
|
|
|
QMessageBox.critical(self, '编辑失败', "提交失败,请检查输入!")
|
|
|
return
|
|
|
|
|
|
# 成绩管理
|
|
|
elif flag == C.FLAG_GRADE:
|
|
|
chinese = self.tableWidget.item(row, 3).text()
|
|
|
math = self.tableWidget.item(row, 4).text()
|
|
|
english = self.tableWidget.item(row, 5).text()
|
|
|
if not chinese.isdigit() or not math.isdigit() or not english.isdigit():
|
|
|
QMessageBox.critical(self, '输入有误', "成绩只能为整数哦!")
|
|
|
return
|
|
|
else:
|
|
|
try:
|
|
|
sql_execute(updateGradeById(id, chinese, math, english))
|
|
|
self.tableWidget.item(row, 6).setText(str(int(chinese) + int(math) + int(english)))
|
|
|
self.editRow(id, flag, False)
|
|
|
|
|
|
except Exception as e:
|
|
|
print(e)
|
|
|
QMessageBox.critical(self, '失败', "提交失败,请检查输入!")
|
|
|
return
|
|
|
|
|
|
# 批量删除
|
|
|
def batchDelete(self, flag):
|
|
|
global all_header_combobox
|
|
|
ids = [-1]
|
|
|
for i in range(len(all_header_combobox)):
|
|
|
try:
|
|
|
if all_header_combobox[i].checkState() == 2:
|
|
|
if flag == C.FLAG_GRADE:
|
|
|
ids.append(self.tableWidget.item(i, 2).text())
|
|
|
else:
|
|
|
ids.append(self.tableWidget.item(i, 1).text())
|
|
|
except Exception as e:
|
|
|
print(e)
|
|
|
if len(ids) == 1:
|
|
|
QMessageBox.information(self, '失败', "未选择数据!")
|
|
|
return
|
|
|
self.deleteRow(ids, flag)
|
|
|
|
|
|
# 删除数据
|
|
|
def deleteRow(self, ids, flag):
|
|
|
"""
|
|
|
:param ids: 数据库id列表
|
|
|
:param flag: 1.学生 2.班级 3.角色 4.班级
|
|
|
:return:
|
|
|
"""
|
|
|
global all_header_combobox
|
|
|
if flag == C.FLAG_GRADE:
|
|
|
title = '清零'
|
|
|
tips = '确定清零该学生成绩?' if len(ids) == 1 else '确定清零' + str(len(ids) - 1) + '个学生成绩?'
|
|
|
else:
|
|
|
title = '删除'
|
|
|
tips = '确定删除该条数据?' if len(ids) == 1 else '确定删除' + str(len(ids) - 1) + '条数据?'
|
|
|
|
|
|
reply = QMessageBox.question(self, title, tips, QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
|
|
|
if reply == QMessageBox.Yes:
|
|
|
if len(ids) <= 1:
|
|
|
button = self.sender()
|
|
|
if button:
|
|
|
# 确定位置的时候这里是关键
|
|
|
row = self.tableWidget.indexAt(button.parent().pos()).row()
|
|
|
if flag == C.FLAG_STUDENT:
|
|
|
result = sql_execute(delStudentById(ids[0]))
|
|
|
self.tableWidget.removeRow(row)
|
|
|
del all_header_combobox[row]
|
|
|
elif flag == C.FLAG_GRADE:
|
|
|
result = sql_execute(updateGradeById(ids[0], '0', '0', '0'))
|
|
|
self.tableWidget.item(row, 3).setText('0')
|
|
|
self.tableWidget.item(row, 4).setText('0')
|
|
|
self.tableWidget.item(row, 5).setText('0')
|
|
|
self.tableWidget.item(row, 6).setText('0')
|
|
|
elif flag == C.FLAG_CLASS:
|
|
|
result = sql_execute(getStudentByClassId(ids[0]))
|
|
|
if len(result) > 0:
|
|
|
QMessageBox.information(self, '失败', "该班级还有学生!请移除学生后再删除该班级。")
|
|
|
return
|
|
|
else:
|
|
|
sql_execute(delClassById(ids[0]))
|
|
|
self.tableWidget.removeRow(row)
|
|
|
elif flag == C.FLAG_ADMIN:
|
|
|
if ids[0] == 1:
|
|
|
QMessageBox.information(self, '失败', "超管账号不可删除!")
|
|
|
return
|
|
|
else:
|
|
|
sql_execute(delAdminById(ids[0]))
|
|
|
self.tableWidget.removeRow(row)
|
|
|
|
|
|
else:
|
|
|
errIds = []
|
|
|
i = None
|
|
|
for id in ids:
|
|
|
if flag == C.FLAG_STUDENT:
|
|
|
result = sql_execute(delStudentById(id))
|
|
|
elif flag == C.FLAG_GRADE:
|
|
|
result = sql_execute(updateGradeByNum(id, '0', '0', '0'))
|
|
|
elif flag == C.FLAG_CLASS:
|
|
|
result = sql_execute(getStudentByClassId(id))
|
|
|
if len(result) > 0:
|
|
|
errIds.append(id)
|
|
|
continue
|
|
|
else:
|
|
|
sql_execute(delClassById(id))
|
|
|
elif flag == C.FLAG_ADMIN:
|
|
|
if id == '1':
|
|
|
QMessageBox.information(self, '失败', "超管账号不可删除!")
|
|
|
continue
|
|
|
else:
|
|
|
sql_execute(delAdminById(id))
|
|
|
i = -1
|
|
|
if flag == C.FLAG_CLASS:
|
|
|
if len(errIds) == 0:
|
|
|
QMessageBox.about(self, '操作完成', "成功删除班级%d个。" % (len(ids) - 1))
|
|
|
else:
|
|
|
QMessageBox.information(self, '操作完成',
|
|
|
"成功删除班级%d个,失败%d个。\n失败班级id:%s\n这些班级内还有学生,无法删除,请移除学生后再进行该操作!"
|
|
|
% (len(ids) - len(errIds) - 1, len(errIds), str(errIds)))
|
|
|
self.getDataList(flag=flag, i=-1)
|
|
|
return
|
|
|
self.getDataList(flag=flag, i=i)
|
|
|
|
|
|
# 查看详情
|
|
|
def viewTable(self, id, flag):
|
|
|
"""
|
|
|
:param id: 数据库id
|
|
|
:param flag: xx管理
|
|
|
:return:
|
|
|
"""
|
|
|
if flag == C.FLAG_GRADE:
|
|
|
result = sql_execute(getStudentById(id))
|
|
|
result = result[0]
|
|
|
sex = '男' if result[3] == 1 else '女'
|
|
|
class_ = result[4]
|
|
|
if class_ not in class_dict.keys():
|
|
|
class_ = '/'
|
|
|
else:
|
|
|
class_ = class_dict[class_]
|
|
|
total = result[5] + result[6] + result[7]
|
|
|
str = 'id:%d\n姓名:%s \n学号:%d\n性别:%s\n班级:%s\n语文成绩:%d\n数学成绩:%d\n英语成绩:%d\n总成绩:%d' \
|
|
|
% (result[0], result[1], result[2], sex, class_, result[5], result[6], result[7], total)
|
|
|
|
|
|
QMessageBox.about(self, '详情', str)
|
|
|
|
|
|
# 编辑、添加、提交、删除按钮
|
|
|
def buttonForRow(self, id, flag, info=''):
|
|
|
"""
|
|
|
:param id: 数据库中数据id
|
|
|
:param flag: xx管理
|
|
|
:param info: 其他附加信息
|
|
|
:return:
|
|
|
"""
|
|
|
widget = QWidget()
|
|
|
|
|
|
# 编辑
|
|
|
updateBtn = QPushButton('编辑')
|
|
|
updateBtn.setStyleSheet(''' text-align : center;
|
|
|
background-color : orange;
|
|
|
height : 30px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
if flag == C.FLAG_CLASS:
|
|
|
updateBtn.clicked.connect(lambda: self.editClass(id, info))
|
|
|
elif flag == C.FLAG_ADMIN:
|
|
|
updateBtn.clicked.connect(lambda: self.editAdmin(id))
|
|
|
else:
|
|
|
updateBtn.clicked.connect(lambda: self.editRow(id, flag))
|
|
|
|
|
|
# 删除
|
|
|
deleteBtn = QPushButton('删除')
|
|
|
deleteBtn.setStyleSheet(''' text-align : center;
|
|
|
background-color : LightCoral;
|
|
|
height : 30px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 13px; ''')
|
|
|
deleteBtn.clicked.connect(lambda: self.deleteRow([id], flag))
|
|
|
|
|
|
# 成绩管理
|
|
|
if flag == C.FLAG_GRADE:
|
|
|
updateBtn.setText("编辑")
|
|
|
deleteBtn.setText("清零")
|
|
|
# 查看
|
|
|
viewBtn = QPushButton('详情')
|
|
|
viewBtn.setStyleSheet(''' text-align : center;
|
|
|
background-color : #5dc7f1;
|
|
|
height : 30px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 13px; ''')
|
|
|
|
|
|
viewBtn.clicked.connect(lambda: self.viewTable(id, flag))
|
|
|
|
|
|
hLayout = QHBoxLayout()
|
|
|
hLayout.addWidget(updateBtn)
|
|
|
if flag == C.FLAG_GRADE:
|
|
|
hLayout.addWidget(viewBtn)
|
|
|
hLayout.addWidget(deleteBtn)
|
|
|
hLayout.setContentsMargins(5, 2, 5, 2)
|
|
|
widget.setLayout(hLayout)
|
|
|
return widget
|
|
|
|
|
|
# 添加提交、取消按钮
|
|
|
def buttonForRowEdit(self, id, flag):
|
|
|
"""
|
|
|
:param id: 数据库中数据id
|
|
|
:param flag: xx管理
|
|
|
:return:
|
|
|
"""
|
|
|
widget = QWidget()
|
|
|
# 提交
|
|
|
updateBtn = QPushButton('提交')
|
|
|
updateBtn.setStyleSheet(''' text-align : center;
|
|
|
background-color : DarkSeaGreen;
|
|
|
height : 30px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 12px ''')
|
|
|
|
|
|
updateBtn.clicked.connect(lambda: self.submitData(id, flag))
|
|
|
|
|
|
# 取消
|
|
|
cancelBtn = QPushButton('取消')
|
|
|
cancelBtn.setStyleSheet(''' text-align : center;
|
|
|
background-color : #aaa;
|
|
|
height : 30px;
|
|
|
border-style: outset;
|
|
|
border-radius: 5px;
|
|
|
color: #fff;
|
|
|
font : 13px; ''')
|
|
|
cancelBtn.clicked.connect(lambda: self.editRow(id, flag, False))
|
|
|
|
|
|
hLayout = QHBoxLayout()
|
|
|
hLayout.addWidget(updateBtn)
|
|
|
hLayout.addWidget(cancelBtn)
|
|
|
hLayout.setContentsMargins(5, 2, 5, 2)
|
|
|
widget.setLayout(hLayout)
|
|
|
return widget
|
|
|
|
|
|
# 获取并更新数据列表 i: 班级index
|
|
|
def getDataList(self, flag, i=None):
|
|
|
global all_class, data_list
|
|
|
data_list = ()
|
|
|
name = self.input_name.text()
|
|
|
if i is None:
|
|
|
i = self.cb.currentIndex()
|
|
|
if i == 0:
|
|
|
classIds = C.USER[4]
|
|
|
elif i < 0:
|
|
|
pass
|
|
|
else:
|
|
|
classIds = str(all_class[i - 1][0])
|
|
|
if flag == C.FLAG_STUDENT:
|
|
|
data_list = sql_execute(getStudentList(classIds, name))
|
|
|
elif flag == C.FLAG_GRADE:
|
|
|
data_list = sql_execute(getGradeList(classIds, name))
|
|
|
elif flag == C.FLAG_CLASS:
|
|
|
data_list = self.getClassList(name)
|
|
|
elif flag == C.FLAG_ADMIN:
|
|
|
data_list = sql_execute(getAdminList(name))
|
|
|
self.addTableRow(flag, data_list)
|
|
|
|
|
|
# 添加数据
|
|
|
def addTableRow(self, flag, dataList):
|
|
|
global all_header_combobox, class_dict
|
|
|
all_header_combobox = []
|
|
|
|
|
|
self.tableWidget.setRowCount(0)
|
|
|
if len(dataList) == 0:
|
|
|
self.tableWidget.setRowCount(1)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText("无数据")
|
|
|
self.tableWidget.setItem(0, 0, item)
|
|
|
return
|
|
|
|
|
|
self.tableWidget.setRowCount(len(dataList))
|
|
|
i = 0
|
|
|
for data in dataList:
|
|
|
if not (flag == C.FLAG_ADMIN and data[0] == 1):
|
|
|
checkbox1 = QtWidgets.QCheckBox()
|
|
|
# 将所有的复选框都添加到 全局变量 all_header_combobox 中
|
|
|
all_header_combobox.append(checkbox1)
|
|
|
# 1.实例化一个新布局
|
|
|
hLayout = QtWidgets.QFormLayout()
|
|
|
# 2.在布局里添加checkBox
|
|
|
hLayout.addWidget(checkbox1)
|
|
|
# 3.在布局里居中放置checkbox1
|
|
|
hLayout.setAlignment(checkbox1, QtCore.Qt.AlignCenter)
|
|
|
# 4.实例化一个QWidget(控件)
|
|
|
widget = QtWidgets.QWidget()
|
|
|
# 5.在QWidget放置布局
|
|
|
widget.setLayout(hLayout)
|
|
|
# 6.在tableWidget1放置widget
|
|
|
self.tableWidget.setCellWidget(i, 0, widget)
|
|
|
if flag == C.FLAG_STUDENT:
|
|
|
item = QTableWidgetItem(str(data[0]))
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 1, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText(data[1])
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 2, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText(str(data[2]))
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 3, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText('男' if data[3] == 1 else '女')
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 4, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText(class_dict[data[4]])
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 5, item)
|
|
|
self.tableWidget.setCellWidget(i, 6, self.buttonForRow(data[0], C.FLAG_STUDENT))
|
|
|
elif flag == C.FLAG_GRADE:
|
|
|
item = QTableWidgetItem(str(data[1]))
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 1, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText(str(data[2]))
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 2, item)
|
|
|
|
|
|
chinese = data[5] if data[5] is not None else 0
|
|
|
math = data[6] if data[6] is not None else 0
|
|
|
english = data[7] if data[7] is not None else 0
|
|
|
total = chinese + math + english
|
|
|
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText(str(chinese))
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 3, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText(str(math))
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 4, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText(str(english))
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 5, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText(str(total))
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 6, item)
|
|
|
self.tableWidget.setCellWidget(i, 7, self.buttonForRow(data[0], C.FLAG_GRADE))
|
|
|
elif flag == C.FLAG_CLASS:
|
|
|
item = QTableWidgetItem(str(data[0]))
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 1, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText(str(data[1]))
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 2, item)
|
|
|
self.tableWidget.setCellWidget(i, 3, self.buttonForRow(data[0], C.FLAG_CLASS, info=data[1]))
|
|
|
elif flag == C.FLAG_ADMIN:
|
|
|
item = QTableWidgetItem(str(data[0]))
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 1, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText(str(data[1]))
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 2, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText(str(data[3]))
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 3, item)
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
try:
|
|
|
class_dict = {}
|
|
|
all_class = self.getClassList()
|
|
|
for class_ in all_class:
|
|
|
# 添加班级字典
|
|
|
class_dict[str(class_[0])] = class_[1]
|
|
|
classs = 'All'
|
|
|
if data[4] == '':
|
|
|
classs = '无'
|
|
|
elif data[4] != '0':
|
|
|
data4 = data[4].split(',')
|
|
|
classs = "/".join(class_dict[d] for d in data4)
|
|
|
except Exception as e:
|
|
|
classs = 'err: 数据有误!'
|
|
|
item.setText(classs)
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 4, item)
|
|
|
# 超管
|
|
|
if data[0] == 1:
|
|
|
item = QTableWidgetItem()
|
|
|
item.setTextAlignment(QtCore.Qt.AlignCenter)
|
|
|
item.setText('无权限')
|
|
|
item.setFlags(QtCore.Qt.ItemIsEnabled)
|
|
|
self.tableWidget.setItem(i, 5, item)
|
|
|
else:
|
|
|
self.tableWidget.setCellWidget(i, 5, self.buttonForRow(data[0], C.FLAG_ADMIN))
|
|
|
i += 1
|
|
|
|
|
|
# 获取班级列表
|
|
|
def getClassList(self, name=''):
|
|
|
print("获取班级列表")
|
|
|
return sql_execute(getClassList(C.USER[4], name))
|
|
|
|
|
|
# 设置左侧选中菜单按钮的样式
|
|
|
def setLeftMenu(self, button):
|
|
|
global activat_menu
|
|
|
if activat_menu != None:
|
|
|
activat_menu.setStyleSheet('''
|
|
|
width:20px;
|
|
|
font-size:15px;
|
|
|
''')
|
|
|
activat_menu = button
|
|
|
button.setStyleSheet('''
|
|
|
width:20px;
|
|
|
font-size:15px;
|
|
|
border-left:4px solid #00bcd4;
|
|
|
font-weight:700;
|
|
|
''')
|
|
|
|
|
|
# 新增数据
|
|
|
def createData(self, flag):
|
|
|
if flag == C.FLAG_CLASS:
|
|
|
text, okPressed = QInputDialog.getText(self, "新增班级", "班级名称:", QLineEdit.Normal, "")
|
|
|
if okPressed and text != '':
|
|
|
try:
|
|
|
sql_execute(insertClass(text))
|
|
|
QMessageBox.about(self, '成功', '新增班级成功!')
|
|
|
self.getDataList(flag, i=-1)
|
|
|
except Exception as e:
|
|
|
QMessageBox.critical(self, '失败', '新增班级失败:\n' + e)
|
|
|
|
|
|
# 编辑班级
|
|
|
def editClass(self, id, old):
|
|
|
text, okPressed = QInputDialog.getText(self, "编辑班级", "班级名称:", QLineEdit.Normal, old)
|
|
|
if okPressed and text != '':
|
|
|
try:
|
|
|
sql_execute(updateClassById(id, text))
|
|
|
QMessageBox.about(self, '成功', '班级编辑成功!')
|
|
|
self.getDataList(C.FLAG_CLASS, i=-1)
|
|
|
except Exception as e:
|
|
|
QMessageBox.critical(self, '失败', '编辑班级失败:\n' + e)
|
|
|
|
|
|
# 退出登录
|
|
|
def logOut(self, tips=False):
|
|
|
if tips:
|
|
|
reply = QMessageBox.question(self, '退出登录', '确定要退出登录吗?', QMessageBox.Yes | QMessageBox.No,
|
|
|
QMessageBox.No)
|
|
|
if reply != QMessageBox.Yes:
|
|
|
return
|
|
|
gl_user = ()
|
|
|
self.aw = C.LOGIN_WINDOW # 创建主窗体对象,实例化Ui_MainWindow
|
|
|
self.w = QMainWindow() # 实例化QMainWindow类
|
|
|
self.aw.setupUi(self.w) # 主窗体对象调用setupUi方法,对QMainWindow对象进行设置
|
|
|
self.w.show() # 显示主窗体
|
|
|
self.hide()
|
|
|
|
|
|
# 修改用户名
|
|
|
def editUsername(self):
|
|
|
reply = QMessageBox.question(self, '修改用户名', '修改用户名后,需要重新登录。是否继续?',
|
|
|
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
|
|
|
if reply == QMessageBox.Yes:
|
|
|
username = self.input_name.text()
|
|
|
sql_execute(updateUsernameById(C.USER[0], username))
|
|
|
QMessageBox.about(self, '成功', '用户名修改成功!请重新登录。')
|
|
|
self.logOut(False)
|
|
|
# self.aw = Ui_MainWindow() # 创建主窗体对象,实例化Ui_MainWindow
|
|
|
# self.w = QMainWindow() # 实例化QMainWindow类
|
|
|
# self.aw.setupUi(self.w) # 主窗体对象调用setupUi方法,对QMainWindow对象进行设置
|
|
|
# self.w.show() # 显示主窗体
|
|
|
|
|
|
# 修改密码
|
|
|
def modifyPassw(self):
|
|
|
pass0 = self.input_pass0.text()
|
|
|
pass1 = self.input_pass1.text()
|
|
|
pass2 = self.input_pass2.text()
|
|
|
if pass1 != pass2:
|
|
|
QMessageBox.information(self, '错误', '两次密码输入不一致。')
|
|
|
return
|
|
|
else:
|
|
|
if C.USER[2] != md5(pass0):
|
|
|
QMessageBox.information(self, '错误', '原密码不正确!')
|
|
|
return
|
|
|
else:
|
|
|
sql_execute(resetAdminPasswById(C.USER[0], pass1))
|
|
|
QMessageBox.about(self, '成功', '密码修改成功!请重新登录。')
|
|
|
self.logOut(False)
|
|
|
|
|
|
# 编辑角色
|
|
|
def editAdmin(self, id):
|
|
|
self.aw = EditAdmin() # 创建主窗体对象,实例化Ui_MainWindow
|
|
|
self.w = QMainWindow() # 实例化QMainWindow类
|
|
|
self.aw.setupUi(self.w, id) # 主窗体对象调用setupUi方法,对QMainWindow对象进行设置
|
|
|
self.w.show() # 显示主窗体
|
|
|
|
|
|
# 新增角色
|
|
|
def addAdmin(self):
|
|
|
self.aw = AddAdmin() # 创建主窗体对象,实例化Ui_MainWindow
|
|
|
self.w = QMainWindow() # 实例化QMainWindow类
|
|
|
self.aw.setupUi(self.w) # 主窗体对象调用setupUi方法,对QMainWindow对象进行设置
|
|
|
self.w.show() # 显示主窗体
|
|
|
|
|
|
# 导入数据
|
|
|
def open_file(self, flag):
|
|
|
"""
|
|
|
:param flag: xx管理
|
|
|
:return:
|
|
|
"""
|
|
|
data_format = ''
|
|
|
if flag == C.FLAG_STUDENT:
|
|
|
data_format = '姓名/学号/性别/班级'
|
|
|
elif flag == C.FLAG_GRADE:
|
|
|
data_format = '姓名/学号/语文成绩/数学成绩/英语成绩'
|
|
|
QMessageBox.information(self, '导入',
|
|
|
"请在弹出的文件选择框中选择数据文件(仅支持csv格式文件)!\n 数据格式:%s,从第2行开始读数据" % data_format)
|
|
|
fileName, fileType = QtWidgets.QFileDialog.getOpenFileName(self, "选取文件", os.getcwd()+'/data', "CSV Files(*.csv)")
|
|
|
if fileName == '':
|
|
|
return
|
|
|
try:
|
|
|
data = pd.read_csv(fileName)
|
|
|
except Exception as e:
|
|
|
data = pd.read_csv(fileName, encoding='gbk')
|
|
|
print(e)
|
|
|
|
|
|
success_count = fail_count = 0
|
|
|
errText = ''
|
|
|
|
|
|
for d in data.itertuples():
|
|
|
try:
|
|
|
# 学生管理
|
|
|
if flag == C.FLAG_STUDENT:
|
|
|
sex = '1' if d[3] == '男' else '2'
|
|
|
class_ = d[4]
|
|
|
if class_ not in class_dict2.keys():
|
|
|
fail_count += 1
|
|
|
errText += '\n %s : 班级[%s]不存在/无权访问!' % (d[1], class_)
|
|
|
continue
|
|
|
else:
|
|
|
class_ = class_dict2[class_]
|
|
|
sql_execute(insertStudent(d[1], d[2], sex, class_))
|
|
|
success_count += 1
|
|
|
elif flag == C.FLAG_GRADE:
|
|
|
sql_execute(updateGradeByNum(d[2], d[3], d[4], d[5]))
|
|
|
success_count += 1
|
|
|
except Exception as e:
|
|
|
fail_count += 1
|
|
|
errText += '\n %s : %s' % (d[1], e)
|
|
|
|
|
|
if fail_count > 0:
|
|
|
QMessageBox.about(self, '导入完成',
|
|
|
"数据成功导入%d条,失败%d条。\n错误信息如下:%s" % (success_count, fail_count, errText))
|
|
|
else:
|
|
|
QMessageBox.about(self, '导入成功', "成功导入数据%d条!" % success_count)
|
|
|
# 刷新列表
|
|
|
self.getDataList(flag)
|
|
|
|
|
|
# 数据导出
|
|
|
def data_export(self, flag):
|
|
|
"""
|
|
|
:param flag: xx管理
|
|
|
:return:
|
|
|
"""
|
|
|
global data_list
|
|
|
self.getDataList(flag)
|
|
|
filename = ''
|
|
|
columns = []
|
|
|
if flag == C.FLAG_STUDENT:
|
|
|
filename = 'Students'
|
|
|
columns = ['姓名', '学号', '性别', '班级']
|
|
|
elif flag == C.FLAG_GRADE:
|
|
|
filename = 'Grade'
|
|
|
columns = ['姓名', '学号', '语文成绩', '数学成绩', '英语成绩', '总分', '排名']
|
|
|
# 保存文件对话框
|
|
|
file_path = QFileDialog.getSaveFileName(self, "数据导出", "data/%s.csv" % filename,
|
|
|
"CSV Files(*.csv);;all files(*.*)")
|
|
|
if file_path[0] == '':
|
|
|
return
|
|
|
try:
|
|
|
save_data = pd.DataFrame(columns=columns)
|
|
|
for index, data in enumerate(data_list):
|
|
|
d = []
|
|
|
if flag == C.FLAG_STUDENT:
|
|
|
sex = '男' if data[3] == 1 else '女'
|
|
|
class_ = data[4]
|
|
|
if class_ not in class_dict.keys():
|
|
|
class_ = '/'
|
|
|
else:
|
|
|
class_ = class_dict[class_]
|
|
|
d = [data[1], data[2], sex, class_]
|
|
|
elif flag == C.FLAG_GRADE:
|
|
|
total = int(data[5]) + int(data[6]) + int(data[7])
|
|
|
d = [data[1], data[2], data[5], data[6], data[7], total, index + 1]
|
|
|
save_data.loc[index] = d
|
|
|
save_data.to_csv(file_path[0], index=False)
|
|
|
QMessageBox.about(self, '成功', "数据成功导出至:%s" % file_path[0])
|
|
|
except Exception as e:
|
|
|
QMessageBox.critical(self, '保存失败', "保存失败:%s" % e)
|
|
|
print(e)
|
|
|
|
|
|
|
|
|
def main():
|
|
|
app = QtWidgets.QApplication(sys.argv)
|
|
|
gui = MainUi()
|
|
|
gui.show()
|
|
|
sys.exit(app.exec_())
|
|
|
|
|
|
|
|
|
# 测试用入口
|
|
|
if __name__ == '__main__':
|
|
|
main()
|