def on_input_score(self): """ 该方法定义了小组信息框里边的点击“录入成绩”按钮时的响应逻辑 :return: """ print('组信息框里边的“修改...”') button_text = self.inputScorepushButton.text() if button_text == '录入成绩': self.pre_score = self.TeamScore.text().strip('') self.TeamScore.setEnabled(True) self.inputScorepushButton.setText('确认?') elif button_text == '确认?': now_score = self.TeamScore.text() self.inputScorepushButton.setText('录入成绩') if now_score.strip('') != self.pre_score: # 将成绩更新进去 team_name = self.TeamName.text() if team_name.strip(''): assi_name = self.TeamAssi.text() teams, sess = MySQLite3Util.get_data(1, team_name) for team in teams: if team.assignment.AssName == assi_name: MySQLite3Util.update_team_score(team.ID, now_score) MySQLite3Util.lazy_close(sess) else: self.TeamScore.setText('') self.TeamScore.setEnabled(False)
def on_vote_team(self): """ 该方法定义了小组信息框里边的点击“为他打call”按钮时的响应逻辑 :return: """ print('为他打call') team_name = self.TeamName.text().strip('') if team_name: msg = '确定为小组:<' + team_name + '> 投票?' reply = QMessageBox.question(self.dialog, '投票确认', msg, QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: assi_name = self.TeamAssi.text() team_vote = self.TeamVote.text() teams, sess = MySQLite3Util.get_data(1, team_name) for team in teams: if team.assignment.AssName == assi_name: vote = team.VoteNum if vote is not None: vote += 1 else: vote = 1 MySQLite3Util.update_team_vote(team.ID, vote) team_vote = str(vote) self.TeamVote.setText(team_vote) MySQLite3Util.lazy_close(sess)
def on_delete_db(self): """ 该方法定义了清空数据库按钮的响应逻辑 :return: """ print('重构数据库') reply = QMessageBox.warning(self.dialog, '警告!', '所有数据将被清空!', QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: MySQLite3Util.delete_all_table() MySQLite3Util.create_db_table()
def load_tree_data(self): """ 将数据库的全部数据以树形图形式加载出来 :return: """ assi_dir = MySQLite3Util.query_all_for_tree() self.AllMsgtreeWidget.setColumnCount(3) self.AllMsgtreeWidget.setHeaderLabels(['课设题目', '小组名称', '成员姓名']) self.AllMsgtreeWidget.clear() if assi_dir is not None: for assi_name in assi_dir.keys(): root_1 = QtWidgets.QTreeWidgetItem(self.AllMsgtreeWidget) root_1.setText(0, assi_name) # 设置根节点名称 if len(assi_dir[assi_name]) != 0: team_lists = assi_dir[assi_name] for i in range(len(team_lists)): team_dir = team_lists[i] for team_name in team_dir.keys(): root_2 = QtWidgets.QTreeWidgetItem(root_1) # 将root_1作为root_2的父节点 root_2.setText(1, team_name) stu_lists = team_dir[team_name] if len(stu_lists) != 0: for j in range(len(stu_lists)): root_3 = QtWidgets.QTreeWidgetItem(root_2) # 将root_2作为root_3的父节点 root_3.setText(2, stu_lists[j]) self.AllMsgtreeWidget.addTopLevelItem(root_1)
def load_stu_box_msg(self, student): """ 将数据库获取到学生信息加载到界面指定位置 :param student: :return: """ self.StuName.setText(str(student.StuName)) self.StuNum.setText(str(student.StuNum)) stu_major = MySQLite3Util.query_one_by_condition(Majors, 'ID', student.MajorID).MajorName self.StuMajor.setText(str(stu_major))
def on_delete_stu_msg(self): """ 该方法定义了学生信息框里边的点击“删除”按钮时的响应逻辑 :return: """ print('学生信息框里边的“删除”') stu_name = self.StuName.text() stu_major = self.StuMajor.text() stu_num = self.StuNum.text() if stu_num.strip('') and stu_name.strip(''): stu = MySQLite3Util.query_one_by_condition(Students, 'StuNum', stu_num) if stu is not None: msg = '请确认信息:\n\t' + '姓名:' + stu_name + ',学号:' + stu_num + ',专业:' + stu_major reply = QMessageBox.question(self.dialog, '该学生信息将被删除', msg, QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: MySQLite3Util.delete_by_id(Students, stu.ID) self.clear_stu_box_msg() self.load_tree_data() self.clear_table_msg() self.clear_team_box_msg()
def on_delete_team_msg(self): """ 该方法定义了小组信息框里边的点击“删除”按钮时的响应逻辑 :return: """ print('小组信息框里边的“删除”') team_name = self.TeamName.text() assi_name = self.TeamAssi.text() team_member = self.TeamMember.text() if team_name.strip(''): teams, sess = MySQLite3Util.get_data(1, team_name) for team in teams: if team.assignment.AssName == assi_name: msg = '请确认信息:\n\t' + '小组名称:' + team_name + '\n\t小组成员:' + team_member reply = QMessageBox.question(self.dialog, '该小组信息将被删除', msg, QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: MySQLite3Util.delete_by_id(Teams, team.ID) self.clear_team_box_msg() self.clear_table_msg() self.load_tree_data() MySQLite3Util.lazy_close(sess)
def tchAddAddButtonClicked(self): """这个动作,应该是这样的:点击确认,并进行输入框的文字获取: 1、题目有输入: i、人数限制有输入。 ii、人数限制无输入,不限制每个课设题目的小组数目限制 2、题目无输入: i、人数限制无输入 ii、人数限制有输入,则弹出警告窗,提示:题目为空请先键入题目内容 3、专业有输入 4、专业无输入,则忽略该输入框 5、若全部输入框都为空,则点击添加按钮弹出警告窗 """ ass = self.TchAddMsgBoxAssilineEdit.text() max_num = self.TchAddMsgBoxTNumlineEdit.text() maj = self.TchAddMsgBoxMajorlineEdit.text() msg = '' if ass.strip() == '' and maj.strip() == '': QMessageBox.warning(self.dialog, "禁止访问", "无输入内容,提交被终止!", QMessageBox.Yes) elif MySQLite3Util.query_some_by_condition(Assignments, 'AssName', ass.strip()): QMessageBox.warning(self.dialog, "禁止访问", "数据库已存在改题目,请重新输入!", QMessageBox.Yes) else: msg = '课设题目:{}\n'.format(ass) + '可允许最大小组数:{}\n'.format( max_num) + '添加专业名为:{}'.format(maj) reply = QMessageBox.question(self.dialog, '请确认信息', msg, QMessageBox.Yes | QMessageBox.No) if QMessageBox.Yes == reply: if ass.strip(): assi = Assignments() assi.AssName = ass if max_num.strip(): assi.MaxCount = max_num MySQLite3Util.add_one_msg(assi) if maj.strip(): major = Majors() major.MajorName = maj MySQLite3Util.add_one_msg(major) self.clear_1()
def load_team_box_msg(self, team): """ 将数据库获取到小组信息加载到界面指定位置 :param team: :return: """ if team.VoteNum is None: team.VoteNum = '' if team.TeamScore is None: team.TeamScore = '' self.TeamName.setText(str(team.TeamName)) self.TeamVote.setText(str(team.VoteNum)) self.TeamScore.setText(str(team.TeamScore)) assi = MySQLite3Util.query_one_by_condition(Assignments, 'ID', team.AssID).AssName self.TeamAssi.setText(str(assi)) students = team.students stu_str = '' for student in students: stu_str += student.StuName + '、' self.TeamMember.setText(str(stu_str))
def get_selected_data(self): """ 获取到单击树形图某一属性的值,并显示在主界面上 :return: """ self.clear_stu_box_msg() self.clear_team_box_msg() for col in range(3): col_text = self.AllMsgtreeWidget.currentItem().text(col) if str(col_text).strip() != '': table_lists = [] if col == 0: # 当col等于0时,表示当前选择的是选题列 assi, sess = MySQLite3Util.get_first_data(col, col_text) for team in assi.teams: stus = MySQLite3Util.query_some_by_condition(Students, 'TeamID', team.ID) for stu in stus: table_map = {'AssName': assi.AssName, 'TeamName': team.TeamName, 'TeamScore': team.TeamScore, 'VoteNum': team.VoteNum, 'StuName': stu.StuName} table_lists.append(table_map) self.load_table_msg(table_lists) MySQLite3Util.lazy_close(sess) elif col == 1: # 当col等于1时,表示当前选择的是小组列 # assi_name是该小组所属题目的题目名 assi_name = self.AllMsgtreeWidget.currentItem().parent().text(col - 1) teams_1, sess = MySQLite3Util.get_data(col, col_text) for team_1 in teams_1: if assi_name == team_1.assignment.AssName: stus = MySQLite3Util.query_some_by_condition(Students, 'TeamID', team_1.ID) for stu in stus: table_map = {'AssName': assi_name, 'TeamName': team_1.TeamName, 'TeamScore': team_1.TeamScore, 'VoteNum': team_1.VoteNum, 'StuName': stu.StuName} table_lists.append(table_map) self.load_team_box_msg(team_1) self.load_table_msg(table_lists) MySQLite3Util.lazy_close(sess) elif col == 2: # 当col等于1时,表示当前选择的是学生信息列 team_name = self.AllMsgtreeWidget.currentItem().parent().text(col - 1) assi_name = self.AllMsgtreeWidget.currentItem().parent().parent().text(col - 2) stus, sess = MySQLite3Util.get_data(col, col_text) # 发现同名同姓的人 for stu in stus: if team_name == stu.team.TeamName: table_map = {'AssName': assi_name, 'TeamName': team_name, 'TeamScore': stu.team.TeamScore, 'VoteNum': stu.team.VoteNum, 'StuName': stu.StuName} table_lists.append(table_map) self.load_team_box_msg(stu.team) self.load_stu_box_msg(stu) self.load_table_msg(table_lists) MySQLite3Util.lazy_close(sess)
def on_quick_search(self): """ 定义了“搜索输入框”键入文字时的即使相应动作逻辑 :return: """ print('我是搜索输入框') key = self.SearchcomboBox.currentText() value = self.SearchlineEdit.text() table_lists = [] if key == '课设题目': assi, sess = MySQLite3Util.get_first_data(0, value) if assi is not None: for team in assi.teams: stus = MySQLite3Util.query_some_by_condition(Students, 'TeamID', team.ID) for stu in stus: table_map = {'AssName': assi.AssName, 'TeamName': team.TeamName, 'TeamScore': team.TeamScore, 'VoteNum': team.VoteNum, 'StuName': stu.StuName} table_lists.append(table_map) self.load_table_msg(table_lists) MySQLite3Util.lazy_close(sess) else: self.clear_table_msg() elif key == '学生姓名': stus, sess = MySQLite3Util.get_data(2, value) for stu in stus: assi_id = MySQLite3Util.query_one_by_condition(Teams, 'ID', stu.TeamID).AssID assi_name = MySQLite3Util.query_one_by_condition(Assignments, 'ID', assi_id).AssName table_map = {'AssName': assi_name, 'TeamName': stu.team.TeamName, 'TeamScore': stu.team.TeamScore, 'VoteNum': stu.team.VoteNum, 'StuName': stu.StuName} table_lists.append(table_map) self.load_table_msg(table_lists) MySQLite3Util.lazy_close(sess) elif key == '专业': majors, sess = MySQLite3Util.get_data(3, value) for major in majors: stus = major.students for stu in stus: assi_id = MySQLite3Util.query_one_by_condition(Teams, 'ID', stu.TeamID).AssID assi_name = MySQLite3Util.query_one_by_condition(Assignments, 'ID', assi_id).AssName team = MySQLite3Util.query_one_by_condition(Teams, 'ID', stu.TeamID) table_map = {'AssName': assi_name, 'TeamName': team.TeamName, 'TeamScore': team.TeamScore, 'VoteNum': team.VoteNum, 'StuName': stu.StuName} table_lists.append(table_map) self.load_table_msg(table_lists) MySQLite3Util.lazy_close(sess)
def onStuAddOk(self): """ 该按钮的逻辑应该是这样的: 1、首先从下拉菜单中选择数据库中已经存在的题目,(先得获取数据库表信息) 2、输入老师给定的唯一的小组编号 3、默认一个小组最多6个人 i、通过下拉菜单选择数据库中已经存在的专业 ii、键入姓名,学号 iii、如果输入信息完整,也就是同时编辑好(专业,学号,姓名)三条,则认为添加成员,若让同一行中任一个框为孔 输入框为空,则该行的全部信息会被忽略掉,认为不添加成员 iiii、点击‘添加’按钮,弹出对话框,对话框文本内容为小组选题,小组成员等信息,目的是让输入者确认信息 j、信息无误,点击对话框确认按钮,将信息持久化进数据库 jj、信息有误,点击对话框取消按钮,回到上一级窗口修改信息 :return: """ select_assi = self.AssicomboBox.currentText() # 检测到所选题目不为空 if select_assi.strip(): # 先根据用户所选的题目去数据库查找改题目是否达到上限也就是判断‘MaxCount=CurrentCount?’ get_assi = MySQLite3Util.query_one_by_condition( Assignments, 'AssName', select_assi) if get_assi.CurrentCount is None: current_count = 0 else: current_count = get_assi.CurrentCount # 判断该课设题目是否设置了小组数目限制,和判断当前小组数量是否达到上限 if get_assi.MaxCount is None or get_assi.MaxCount != get_assi.CurrentCount: lists = [] stu_1 = { 'maj': self.MajorcomboBox_1.currentText(), 'stu_name': self.MsgBoxNamelineEdit_1.text(), 'num': self.MsgBoxNumlineEdit_1.text() } lists.append(stu_1) stu_2 = { 'maj': self.MajorcomboBox_2.currentText(), 'stu_name': self.MsgBoxNamelineEdit_2.text(), 'num': self.MsgBoxNumlineEdit_2.text() } lists.append(stu_2) stu_3 = { 'maj': self.MajorcomboBox_3.currentText(), 'stu_name': self.MsgBoxNamelineEdit_3.text(), 'num': self.MsgBoxNumlineEdit_3.text() } lists.append(stu_3) stu_4 = { 'maj': self.MajorcomboBox_4.currentText(), 'stu_name': self.MsgBoxNamelineEdit_4.text(), 'num': self.MsgBoxNumlineEdit_4.text() } lists.append(stu_4) stu_5 = { 'maj': self.MajorcomboBox_5.currentText(), 'stu_name': self.MsgBoxNamelineEdit_5.text(), 'num': self.MsgBoxNumlineEdit_5.text() } lists.append(stu_5) stu_6 = { 'maj': self.MajorcomboBox_6.currentText(), 'stu_name': self.MsgBoxNamelineEdit_6.text(), 'num': self.MsgBoxNumlineEdit_6.text() } lists.append(stu_6) team_name = self.MsgBoxTeamNamelineEdit.text() msg = '选定的课设题目是:{}\n老师分配的小组名称是:{}\n小组成员信息:\n'.format( select_assi, team_name) # 对该列表倒序迭代,实现“在迭代中删除特定数据”的功能 for i in range(len(lists) - 1, -1, -1): # 如果监测到该条记录不完整也就是isNull方法返回True,则把该条记录删除 if self.isNull(lists[i]): lists.pop(i) else: dict_1 = lists[i] msg += '\t<专业:{}>--<姓名:{}>--<学号:{}>\n'.format( dict_1['maj'], dict_1['stu_name'], dict_1['num']) reply = QMessageBox.question(self.dialog, '请确认信息', msg, QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: # 新建一个team(小组)模型对象 team_model = Teams() team_model.TeamName = team_name team_model.AssID = get_assi.ID # 这里应该是插入小组信息,返回小组ID team_id = MySQLite3Util.add_one_msg(team_model) for j in range(len(lists)): # 这个地方负责对学生信息的插入 # 新建一个Student(学生)模型对象 stu_model = Students() stu_model.StuName = lists[j]['stu_name'] stu_model.StuNum = lists[j]['num'] stu_model.MajorID = MySQLite3Util.query_one_by_condition( Majors, 'MajorName', lists[j]['maj'])['ID'] stu_model.TeamID = team_id MySQLite3Util.add_one_msg(stu_model) # 这里完成了小组全部人数的插入,应该更新课设题目的当前是小组数量的那个值也就是CurrentCount current_count += 1 MySQLite3Util.update_AssiCurrentCount( current_count, select_assi) self.dialog.close() else: QMessageBox.warning( self.dialog, '', '该课设题目已达到最大数量限制:' + '{}人\n请选择其他题目!'.format(get_assi.MaxCount), QMessageBox.Yes) else: # 若检测到没有选择题目就点击了“添加按钮” QMessageBox.warning(self.dialog, '', '未选择任何课设题目,添加操作被终止!', QMessageBox.Yes)
def __init__(self): self.dialog = QtWidgets.QDialog() window = Ui_StuAddMsgBox() window.setupUi(self.dialog) # 只显示关闭按钮,也就是右上角只有一个× self.dialog.setWindowFlags(QtCore.Qt.WindowCloseButtonHint) # 设置窗口的标题 self.dialog.setWindowTitle('添加小组') # 禁止调整窗口大小 self.dialog.setFixedSize(self.dialog.width(), self.dialog.height()) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap('iconLibrary/icon2.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.dialog.setWindowIcon(icon) # 定义界面得各种输入框,从_StuAddMsgBox复制过来 self.AssicomboBox = window.AssicomboBox self.MsgBoxTeamNamelineEdit = window.MsgBoxTeamNamelineEdit self.MajorcomboBox_1 = window.MajorcomboBox_1 self.MajorcomboBox_2 = window.MajorcomboBox_2 self.MajorcomboBox_3 = window.MajorcomboBox_3 self.MajorcomboBox_4 = window.MajorcomboBox_4 self.MajorcomboBox_5 = window.MajorcomboBox_5 self.MajorcomboBox_6 = window.MajorcomboBox_6 self.MsgBoxNamelineEdit_1 = window.MsgBoxNamelineEdit_1 self.MsgBoxNamelineEdit_2 = window.MsgBoxNamelineEdit_2 self.MsgBoxNamelineEdit_3 = window.MsgBoxNamelineEdit_3 self.MsgBoxNamelineEdit_4 = window.MsgBoxNamelineEdit_4 self.MsgBoxNamelineEdit_5 = window.MsgBoxNamelineEdit_5 self.MsgBoxNamelineEdit_6 = window.MsgBoxNamelineEdit_6 self.MsgBoxNumlineEdit_1 = window.MsgBoxNumlineEdit_1 self.MsgBoxNumlineEdit_2 = window.MsgBoxNumlineEdit_2 self.MsgBoxNumlineEdit_3 = window.MsgBoxNumlineEdit_3 self.MsgBoxNumlineEdit_4 = window.MsgBoxNumlineEdit_4 self.MsgBoxNumlineEdit_5 = window.MsgBoxNumlineEdit_5 self.MsgBoxNumlineEdit_6 = window.MsgBoxNumlineEdit_6 self.StuAddOkButton = window.StuAddOkButton self.StuAddCloseButton = window.StuAddCloseButton # 给按钮绑定监听器 self.StuAddOkButton.clicked.connect(self.onStuAddOk) self.StuAddCloseButton.clicked.connect(self.dialog.close) assi_lists = MySQLite3Util.query_all(Assignments) for assi_list in assi_lists: self.AssicomboBox.addItem(assi_list.AssName) # currentIndexChanged方法实现当当前列表的索引发生改变的时候,返回一个信号 self.AssicomboBox.currentIndexChanged.connect(self.AssiBoxhasTest) self.MsgBoxTeamNamelineEdit.setEnabled(False) maj_lists = MySQLite3Util.query_all(Majors) for maj_list in maj_lists: self.MajorcomboBox_1.addItem(maj_list.MajorName) self.MajorcomboBox_2.addItem(maj_list.MajorName) self.MajorcomboBox_3.addItem(maj_list.MajorName) self.MajorcomboBox_4.addItem(maj_list.MajorName) self.MajorcomboBox_5.addItem(maj_list.MajorName) self.MajorcomboBox_6.addItem(maj_list.MajorName) self.MajorcomboBox_1.setEnabled(False) self.MajorcomboBox_2.setEnabled(False) self.MajorcomboBox_3.setEnabled(False) self.MajorcomboBox_4.setEnabled(False) self.MajorcomboBox_5.setEnabled(False) self.MajorcomboBox_6.setEnabled(False) self.MsgBoxNamelineEdit_1.setEnabled(False) self.MsgBoxNamelineEdit_2.setEnabled(False) self.MsgBoxNamelineEdit_3.setEnabled(False) self.MsgBoxNamelineEdit_4.setEnabled(False) self.MsgBoxNamelineEdit_5.setEnabled(False) self.MsgBoxNamelineEdit_6.setEnabled(False) self.MsgBoxNumlineEdit_1.setEnabled(False) self.MsgBoxNumlineEdit_2.setEnabled(False) self.MsgBoxNumlineEdit_3.setEnabled(False) self.MsgBoxNumlineEdit_4.setEnabled(False) self.MsgBoxNumlineEdit_5.setEnabled(False) self.MsgBoxNumlineEdit_6.setEnabled(False)