基于Python的课堂点名器V4
前言
还是一样,又来了新的需求这里我们就要用到Python连接MySQL的相关模块了。
Python连接MySQL的模块我们这里选用pymysql
,自己这两个库东西挺多的,自己分别写了博文记载自己用到的部分:
Python连接MySQL(
pymysql
):
https://blog.csdn.net/Ans\_min/article/details/105186069
思路
这次相对V3就是单纯的加了MySQL的链接,我们导入pymysql模块、改写dmq_file_in
那四个函数(dmq_file_in_late
、dmq_file_in_absence
、dmq_file_in_sick
和dmq_file_in_early
),再在dmq_init
函数里添加连接数据库部分就可以了,这部分我们取名为data_in
。
自己修改了一下V3的思路图:新加的在图中都以红色和黄底表示了出来。
代码
我们贴出代码,相关说明都在注释里
注意:代码正常运行的条件有:MySQL中创建了名为dmqdb的数据库,该数据库下创建好了student_list
、late_list
、early_list
、absence_list
、sick_list
五张表。
五张表的属性都是一样,给出Navicat截图
--以Student表为例
create table Student(
SNumber varchar(10) PRIMARY KEY not null,
SName varchar(20) not null
);
/* 其他的表就是列名换了一下,其他都一样。 late_list是LNumber和LName,absence_list是ANumber和AName, early_list是ENumber和EName,sick_list是SINumber和SIName */
截图就放一个student_list表做示范,其他表就列名不同,其他都一样。
# 点名器V3
import csv
import random
import pymysql
# 规定的一些常量
student_late = [] # 存储迟到名单
students_late = [] # 迟到录入名单 这种形式[[姓名, 学号], [], [], ....]
# student_absence = [] # 存储旷课名单(不需要,因为absence这个表是通过late和early交运算得到的)
students_absence = [] # 旷课录入名单 这种形式[[姓名, 学号], [], [], ....]
student_sick = [] # 存储请假名单
students_sick = [] # 请假录入名单 这种形式[[姓名, 学号], [], [], ....]
student_early = [] # 存储早退名单
students_early = [] # 早退录入名单 这种形式[[姓名, 学号], [], [], ....]
conn = pymysql.connect(host='localhost', port=3306, user='root', password='123', db='dmqdb') # 创建connect对象,连接数据库
###
# 功能:csv文件写入数据库
# 输入:csv文件路径名(str)
# 返回:None
###
def data_in(file):
# 清空所有表(原因应该都懂,如果每次程序开始不清空,很容易积累错误信息)
cur = conn.cursor()
cur.execute("truncate table student_list")
conn.commit()
cur.execute("truncate table late_list")
conn.commit()
cur.execute("truncate table early_list")
conn.commit()
cur.execute("truncate table absence_list")
conn.commit()
cur.execute("truncate table sick_list")
conn.commit()
# 从csv中向student_list插入
with open(file, newline='') as info:
data = csv.reader(info)
for row in data:
cur = conn.cursor() # 创建游标
cur.execute('INSERT INTO student_list values '
+ str((row[1], row[0]))) # 传递每一行的数据
conn.commit() # 确定执行语句
###
# 功能:读入csv文件学生名单
# 输入:文件名(string)
# 返回值:学生全部信息(dict),学生名单(list)
###
def file_in(file_name):
students_info = { }
students_name = []
# open()函数读入文件
with open(file_name, newline='') as info:
reader = csv.reader(info)
for row in reader:
students_info[row[0]] = row[1]
students_name.append(row[0])
return students_info, students_name
###
# 功能:产生随机学生名单
# 输入:学生名单(list)
# 返回值:打乱的学生名单(list)
###
def new_list(students_name):
student_upset_name = random.sample(students_name, len(students_name))
return student_upset_name
###
# 功能:完成点名器的初始化,整合了new_list()、data_in()和file_in()三个函数
# 输入:学生名单(list)
# 返回值:学生信息(dict)和打乱的学生名单(list)
###
def dmq_init(file_name):
data_in(file_name)
student_info = file_in(file_name)[0]
# print(students_wg_dict)
student_upset_name = new_list(file_in(file_name)[1])
# print(students_wg_list)
return student_info, student_upset_name
###
# 功能:第一次点名,更新请假名单和迟到名单
# 输入:打乱的学生名单(list)
# 返回值:None
###
def dmq_dm(student_upset_name):
student_dm_wrong = []
print('课程即将开始!开始第一次点名!\n')
for name in student_upset_name:
temp = input(name + "到了吗?(输入到或没到,请假输入已请假)")
if temp == "到":
continue
elif temp == "没到":
student_late.append(name)
elif temp == '已请假':
student_sick.append(name)
else:
student_dm_wrong.append(name)
print("请按要求输入!该名字被放置最后点名。")
if student_dm_wrong:
for name in student_dm_wrong:
temp = input(name + "到了吗?(输入到或没到,请假输入已请假)")
if temp == "到":
continue
elif temp == "没到":
student_late.append(name)
elif temp == '已请假':
student_sick.append(name)
else:
print("仍然未按照要求输入!算入迟到名单!")
student_late.append(name)
###
# 功能:迟到名单的写入和输出
# 输入:迟到学生名单(list)和学生全部信息(dict)以及一行的显示数量
# 返回值:None
###
def dmq_file_in_late(late_list, student_info, num):
# 向 迟到录入名单 加入信息
for name in late_list:
students_late.append((name, student_info[name]))
# 输出 迟到录入名单
print_info('迟到', students_late, num)
# 写入 迟到表
cur = conn.cursor()
for info in students_late:
cur.execute("INSERT INTO late_list VALUES " + str(info))
conn.commit()
print("\n已导出迟到学生名单!数据库dmqDB下的late_list表中\n")
###
# 功能:请假名单的写入和输出
# 输入:请假学生名单(list)和学生全部信息(dict)以及一行的显示数量
# 返回值:None
###
def dmq_file_in_sick(sick_list, student_info, num):
# dmq_file_in_sick()、dmq_file_in_early()和dmq_file_in_absence()都是一个原理,注释参照dmq_file_in_late()
for name in sick_list:
students_sick.append((name, student_info[name]))
print_info('请假', students_sick, num)
# 写入表
cur = conn.cursor()
for info in students_sick:
cur.execute("INSERT INTO sick_list VALUES " + str(info))
conn.commit()
print("\n已导出请假学生名单!数据库dmqDB下的sick_list表中\n")
###
# 功能:早退名单的写入和输出
# 输入:早退学生名单(list)和学生全部信息(dict)以及一行的显示数量
# 返回值:None
###
def dmq_file_in_early(early_list, student_info, num):
for name in early_list:
students_early.append((name, student_info[name]))
print_info('早退', students_early, num)
cur = conn.cursor()
for info in students_early:
cur.execute("INSERT INTO early_list VALUES " + str(info))
conn.commit()
print("\n已导出早退学生名单!数据库dmqDB下的early_list表中\n")
###
# 功能:旷课名单的写入和输出
# 输入:旷课学生名单(list)和学生全部信息(dict)以及一行的显示数量
# 返回值:None
###
def dmq_file_in_absence(absence_list, student_info, num):
for name in absence_list:
students_absence.append((name, student_info[name]))
print_info('旷课', students_absence, num)
cur = conn.cursor()
for info in students_absence:
cur.execute("INSERT INTO absence_list VALUES " + str(info))
conn.commit()
print("\n已导出旷课学生名单!数据库dmqDB下的absence_list表中\n")
###
# 功能:输出 特定 列表数据
# 输入:名单名称、特定的list [[*, *], [*, *], [*, *], ...]和每行显示数字
# 返回值:None
###
def print_info(string, special_list, num):
count = 0
print('--'*5 + '**' + string + '名单(' + str(num) + '个一行)' + '**' + '--'*5)
for i in special_list:
if (count % num == 0) & (count != 0):
print()
print(i[0]+","+i[1], end=' ')
count += 1
###
# 功能:第二次点名
# 输入:打乱的学生名单(list)
# 返回值:早退的学生名单(list)
###
def dmq_dm_2(list_1):
name_list = list(set(list_1) - set(student_sick))
student_dm_wrong = []
print('\n下课时间到!开始第二次点名!\n')
for name in name_list:
temp = input(name + "在吗?(输入在或不在)")
if temp == "在":
continue
elif temp == "不在":
student_early.append(name)
else:
student_dm_wrong.append(name)
print("请按要求输入!该名字被放置最后点名。")
if student_dm_wrong:
for name in student_dm_wrong:
temp = input(name + "在吗?(输入在或不在)")
if temp == "在":
continue
elif temp == "不在":
student_early.append(name)
else:
print("仍然未按照要求输入!算入早退名单!")
student_early.append(name)
###
# 功能: 计算两列表的交集
# 输入: 两个列表(不分先后)
# 返回: None
###
def list_mix(list_1, list_2):
mix = []
for i in list_1:
if i in list_2:
mix.append(i)
return mix
def main(file_name, num):
# 读入csv文件
temp = dmq_init(file_name)
student_info = temp[0]
name_list = temp[1]
# 第一次点名
dmq_dm(name_list)
# 第二次点名
dmq_dm_2(name_list)
# 对运算结果做出调整
# 交集运算出旷课名单
student_absence = list_mix(student_late, student_early)
# 迟到名单里不能有旷课和请假的人(确保一下)
student_late_new = list(set(student_late) - set(student_absence) - set(student_sick))
# 早退名单里不能有旷课和请假的人(确保一下)
student_early_new = list(set(student_early) - set(student_absence) - set(student_sick))
# 输出并导入请假名单
dmq_file_in_sick(student_sick, student_info, num)
# 输出并导入迟到名单
dmq_file_in_late(student_late_new, student_info, num)
# 输出并导入早退名单
dmq_file_in_early(student_early_new, student_info, num)
# 输出并导入旷课名单
dmq_file_in_absence(student_absence, student_info, num)
# return '程序结束'
# 5代表5个名字一行输出
main("test.csv", 5)
最后
这次增加功能非常简单快速,V3到V4的过程就1个小时不到,可能是代码的可扩展性好和耦合性低有关,自己前两次整改代码还是有用的。
自己最近都在尝试用GUI界面来实现点名器V4,不过一直还在调试阶段,事件触发和处理回调仍然是自己没有攻克的难题。
大家有兴趣也可以自己试试GUI界面,这里分享出自己找到的学习资料:
Python GUI(
tkinter
) :
https://blog.csdn.net/Ans\_min/article/details/105111342
这位博主tkinter系列整理的很全,自己前期零零散散找了些tkinter组件学习,很多都连不起来,导致现在的GUI界面始终有错误,不协调,学习一个模块还是要系统性的学习,这位博主的tkinter系列就很好。
文章就到这里,看完有帮助记得点赞。
还没有评论,来说两句吧...