基于Python的课堂点名器V4

阳光穿透心脏的1/2处 2021-09-24 02:36 190阅读 0赞

前言

还是一样,又来了新的需求
在这里插入图片描述这里我们就要用到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_latedmq_file_in_absencedmq_file_in_sickdmq_file_in_early),再在dmq_init函数里添加连接数据库部分就可以了,这部分我们取名为data_in
自己修改了一下V3的思路图:
在这里插入图片描述在这里插入图片描述在这里插入图片描述新加的在图中都以红色和黄底表示了出来。

代码

我们贴出代码,相关说明都在注释里
注意:代码正常运行的条件有:MySQL中创建了名为dmqdb的数据库,该数据库下创建好了student_listlate_listearly_listabsence_listsick_list五张表。
五张表的属性都是一样,给出Navicat截图

  1. --以Student表为例
  2. create table Student(
  3. SNumber varchar(10) PRIMARY KEY not null,
  4. SName varchar(20) not null
  5. );
  6. /* 其他的表就是列名换了一下,其他都一样。 late_list是LNumber和LName,absence_list是ANumber和AName, early_list是ENumber和EName,sick_list是SINumber和SIName */

截图就放一个student_list表做示范,其他表就列名不同,其他都一样。
在这里插入图片描述

  1. # 点名器V3
  2. import csv
  3. import random
  4. import pymysql
  5. # 规定的一些常量
  6. student_late = [] # 存储迟到名单
  7. students_late = [] # 迟到录入名单 这种形式[[姓名, 学号], [], [], ....]
  8. # student_absence = [] # 存储旷课名单(不需要,因为absence这个表是通过late和early交运算得到的)
  9. students_absence = [] # 旷课录入名单 这种形式[[姓名, 学号], [], [], ....]
  10. student_sick = [] # 存储请假名单
  11. students_sick = [] # 请假录入名单 这种形式[[姓名, 学号], [], [], ....]
  12. student_early = [] # 存储早退名单
  13. students_early = [] # 早退录入名单 这种形式[[姓名, 学号], [], [], ....]
  14. conn = pymysql.connect(host='localhost', port=3306, user='root', password='123', db='dmqdb') # 创建connect对象,连接数据库
  15. ###
  16. # 功能:csv文件写入数据库
  17. # 输入:csv文件路径名(str)
  18. # 返回:None
  19. ###
  20. def data_in(file):
  21. # 清空所有表(原因应该都懂,如果每次程序开始不清空,很容易积累错误信息)
  22. cur = conn.cursor()
  23. cur.execute("truncate table student_list")
  24. conn.commit()
  25. cur.execute("truncate table late_list")
  26. conn.commit()
  27. cur.execute("truncate table early_list")
  28. conn.commit()
  29. cur.execute("truncate table absence_list")
  30. conn.commit()
  31. cur.execute("truncate table sick_list")
  32. conn.commit()
  33. # 从csv中向student_list插入
  34. with open(file, newline='') as info:
  35. data = csv.reader(info)
  36. for row in data:
  37. cur = conn.cursor() # 创建游标
  38. cur.execute('INSERT INTO student_list values '
  39. + str((row[1], row[0]))) # 传递每一行的数据
  40. conn.commit() # 确定执行语句
  41. ###
  42. # 功能:读入csv文件学生名单
  43. # 输入:文件名(string)
  44. # 返回值:学生全部信息(dict),学生名单(list)
  45. ###
  46. def file_in(file_name):
  47. students_info = { }
  48. students_name = []
  49. # open()函数读入文件
  50. with open(file_name, newline='') as info:
  51. reader = csv.reader(info)
  52. for row in reader:
  53. students_info[row[0]] = row[1]
  54. students_name.append(row[0])
  55. return students_info, students_name
  56. ###
  57. # 功能:产生随机学生名单
  58. # 输入:学生名单(list)
  59. # 返回值:打乱的学生名单(list)
  60. ###
  61. def new_list(students_name):
  62. student_upset_name = random.sample(students_name, len(students_name))
  63. return student_upset_name
  64. ###
  65. # 功能:完成点名器的初始化,整合了new_list()、data_in()和file_in()三个函数
  66. # 输入:学生名单(list)
  67. # 返回值:学生信息(dict)和打乱的学生名单(list)
  68. ###
  69. def dmq_init(file_name):
  70. data_in(file_name)
  71. student_info = file_in(file_name)[0]
  72. # print(students_wg_dict)
  73. student_upset_name = new_list(file_in(file_name)[1])
  74. # print(students_wg_list)
  75. return student_info, student_upset_name
  76. ###
  77. # 功能:第一次点名,更新请假名单和迟到名单
  78. # 输入:打乱的学生名单(list)
  79. # 返回值:None
  80. ###
  81. def dmq_dm(student_upset_name):
  82. student_dm_wrong = []
  83. print('课程即将开始!开始第一次点名!\n')
  84. for name in student_upset_name:
  85. temp = input(name + "到了吗?(输入到或没到,请假输入已请假)")
  86. if temp == "到":
  87. continue
  88. elif temp == "没到":
  89. student_late.append(name)
  90. elif temp == '已请假':
  91. student_sick.append(name)
  92. else:
  93. student_dm_wrong.append(name)
  94. print("请按要求输入!该名字被放置最后点名。")
  95. if student_dm_wrong:
  96. for name in student_dm_wrong:
  97. temp = input(name + "到了吗?(输入到或没到,请假输入已请假)")
  98. if temp == "到":
  99. continue
  100. elif temp == "没到":
  101. student_late.append(name)
  102. elif temp == '已请假':
  103. student_sick.append(name)
  104. else:
  105. print("仍然未按照要求输入!算入迟到名单!")
  106. student_late.append(name)
  107. ###
  108. # 功能:迟到名单的写入和输出
  109. # 输入:迟到学生名单(list)和学生全部信息(dict)以及一行的显示数量
  110. # 返回值:None
  111. ###
  112. def dmq_file_in_late(late_list, student_info, num):
  113. # 向 迟到录入名单 加入信息
  114. for name in late_list:
  115. students_late.append((name, student_info[name]))
  116. # 输出 迟到录入名单
  117. print_info('迟到', students_late, num)
  118. # 写入 迟到表
  119. cur = conn.cursor()
  120. for info in students_late:
  121. cur.execute("INSERT INTO late_list VALUES " + str(info))
  122. conn.commit()
  123. print("\n已导出迟到学生名单!数据库dmqDB下的late_list表中\n")
  124. ###
  125. # 功能:请假名单的写入和输出
  126. # 输入:请假学生名单(list)和学生全部信息(dict)以及一行的显示数量
  127. # 返回值:None
  128. ###
  129. def dmq_file_in_sick(sick_list, student_info, num):
  130. # dmq_file_in_sick()、dmq_file_in_early()和dmq_file_in_absence()都是一个原理,注释参照dmq_file_in_late()
  131. for name in sick_list:
  132. students_sick.append((name, student_info[name]))
  133. print_info('请假', students_sick, num)
  134. # 写入表
  135. cur = conn.cursor()
  136. for info in students_sick:
  137. cur.execute("INSERT INTO sick_list VALUES " + str(info))
  138. conn.commit()
  139. print("\n已导出请假学生名单!数据库dmqDB下的sick_list表中\n")
  140. ###
  141. # 功能:早退名单的写入和输出
  142. # 输入:早退学生名单(list)和学生全部信息(dict)以及一行的显示数量
  143. # 返回值:None
  144. ###
  145. def dmq_file_in_early(early_list, student_info, num):
  146. for name in early_list:
  147. students_early.append((name, student_info[name]))
  148. print_info('早退', students_early, num)
  149. cur = conn.cursor()
  150. for info in students_early:
  151. cur.execute("INSERT INTO early_list VALUES " + str(info))
  152. conn.commit()
  153. print("\n已导出早退学生名单!数据库dmqDB下的early_list表中\n")
  154. ###
  155. # 功能:旷课名单的写入和输出
  156. # 输入:旷课学生名单(list)和学生全部信息(dict)以及一行的显示数量
  157. # 返回值:None
  158. ###
  159. def dmq_file_in_absence(absence_list, student_info, num):
  160. for name in absence_list:
  161. students_absence.append((name, student_info[name]))
  162. print_info('旷课', students_absence, num)
  163. cur = conn.cursor()
  164. for info in students_absence:
  165. cur.execute("INSERT INTO absence_list VALUES " + str(info))
  166. conn.commit()
  167. print("\n已导出旷课学生名单!数据库dmqDB下的absence_list表中\n")
  168. ###
  169. # 功能:输出 特定 列表数据
  170. # 输入:名单名称、特定的list [[*, *], [*, *], [*, *], ...]和每行显示数字
  171. # 返回值:None
  172. ###
  173. def print_info(string, special_list, num):
  174. count = 0
  175. print('--'*5 + '**' + string + '名单(' + str(num) + '个一行)' + '**' + '--'*5)
  176. for i in special_list:
  177. if (count % num == 0) & (count != 0):
  178. print()
  179. print(i[0]+","+i[1], end=' ')
  180. count += 1
  181. ###
  182. # 功能:第二次点名
  183. # 输入:打乱的学生名单(list)
  184. # 返回值:早退的学生名单(list)
  185. ###
  186. def dmq_dm_2(list_1):
  187. name_list = list(set(list_1) - set(student_sick))
  188. student_dm_wrong = []
  189. print('\n下课时间到!开始第二次点名!\n')
  190. for name in name_list:
  191. temp = input(name + "在吗?(输入在或不在)")
  192. if temp == "在":
  193. continue
  194. elif temp == "不在":
  195. student_early.append(name)
  196. else:
  197. student_dm_wrong.append(name)
  198. print("请按要求输入!该名字被放置最后点名。")
  199. if student_dm_wrong:
  200. for name in student_dm_wrong:
  201. temp = input(name + "在吗?(输入在或不在)")
  202. if temp == "在":
  203. continue
  204. elif temp == "不在":
  205. student_early.append(name)
  206. else:
  207. print("仍然未按照要求输入!算入早退名单!")
  208. student_early.append(name)
  209. ###
  210. # 功能: 计算两列表的交集
  211. # 输入: 两个列表(不分先后)
  212. # 返回: None
  213. ###
  214. def list_mix(list_1, list_2):
  215. mix = []
  216. for i in list_1:
  217. if i in list_2:
  218. mix.append(i)
  219. return mix
  220. def main(file_name, num):
  221. # 读入csv文件
  222. temp = dmq_init(file_name)
  223. student_info = temp[0]
  224. name_list = temp[1]
  225. # 第一次点名
  226. dmq_dm(name_list)
  227. # 第二次点名
  228. dmq_dm_2(name_list)
  229. # 对运算结果做出调整
  230. # 交集运算出旷课名单
  231. student_absence = list_mix(student_late, student_early)
  232. # 迟到名单里不能有旷课和请假的人(确保一下)
  233. student_late_new = list(set(student_late) - set(student_absence) - set(student_sick))
  234. # 早退名单里不能有旷课和请假的人(确保一下)
  235. student_early_new = list(set(student_early) - set(student_absence) - set(student_sick))
  236. # 输出并导入请假名单
  237. dmq_file_in_sick(student_sick, student_info, num)
  238. # 输出并导入迟到名单
  239. dmq_file_in_late(student_late_new, student_info, num)
  240. # 输出并导入早退名单
  241. dmq_file_in_early(student_early_new, student_info, num)
  242. # 输出并导入旷课名单
  243. dmq_file_in_absence(student_absence, student_info, num)
  244. # return '程序结束'
  245. # 5代表5个名字一行输出
  246. 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系列就很好。

文章就到这里,看完有帮助记得点赞。

发表评论

表情:
评论列表 (有 0 条评论,190人围观)

还没有评论,来说两句吧...

相关阅读

    相关 班级点名

    点名器: 1、题目 利用定时器的原理写出一个简单的班级点名器,样式自拟,实现功能即可! 思路与写法: (1)、拿到一个案例,我们首先要写出html的页面结构来,

    相关 基于Python简单课堂点名V1

    前言 前面Python学习的文章1到8讲的都是知识点,语言这东西还是越用越熟,由大到小,我们写一个大一点的程序,然后其中有什么不清楚的再去找一些资料来看。 那自己今天就