用Python实现一个简单课堂点名器V5
一,任务描述
-
实现教师用户的注册和用户登陆功能,将教师用户名和密码存储在MySQL数据库。
-
以网工18、网工19的学生名单为例,从外部文件分别导入程序中,并将学生信息分别存入MySQL数据库中的两个表中。
-
实现登陆后的教师用户选择所需点名的课程和班级的功能。
-
随机对班级所有同学进行点名。
-
判断未到学生是否有请假条,有则视为请假,无则视为旷课。
-
对点名结束后进入教室的学生将旷课改为迟到。
-
对中途离开课堂学生计为早退(需要考虑学生既是迟到又是早退的情况)。
-
将未到学生按照请假,旷课,迟到,早退四类分别存储在MySQL数据库中的四个表中。
-
从MySQL数据中读取请假、旷课、迟到、早退四类信息并分别展示。
二, 设计方案
- 运用GUI程序面向对象的思想
先导入所需模块(tkinter, pymysql, xlrd, random)
import xlrd # 导入xlrd包,对Excel读取数据
import random # 导入随机random模块
import pymysql # 导入pymysql包,对mysql数据库进行连接
from tkinter import *
from tkinter import messagebox
(2) 创建DianMing()类:
定义函数student,输入读取Excel文件地址,从Excel文件读取学号和姓名,返回全体学生学号和姓名列表。
定义函数num:输入想要点名人数,返回点名人数。为了输入格式的完整。
定义函数dianming:输入函数student返回的列表学号,姓名,人数,进行随机点名,返回随机学号,姓名列表。
定义函数zaotui:输入列表学号,姓名,判断是否早退,返回早退学号,姓名列表。用于后面函数的调用。
定义函数puanduan1:输入函数dianming返回的学号,姓名,判断是否来了,返回点名期间早退和没来学号,姓名列表。里面调用函数zaotui函数用来返回没来的学号和姓名列表。
定义函数panduan2:输入列表学号,姓名, 向缺勤表和迟到表里插入数据 ,返回早退学号列表,用于判断点名期间没有请假条的人。里面也有函数zaotui用来返回早退的学号和姓名列表。
定义函数qingjia:输入函数puanduan1返回没来的列表学号,判断是否有请假条,有就将信息插入请假表中,没有就调用函数panduan2向缺勤表和迟到表里插入数据,返回点名期间没来并且早退学号,姓名列表。
定义函数data:输入学号,姓名列表和插入的sql语句,利用该函数将信息一个一个插入相应的表中。
(3) 创建Applicantion(Frame)类:(继承了Frame)
定义构造函数__init__(self,
master=None):为了将窗口(Tk)和容器(Frame)结合。
定义函数createWidget(self):创建登录界面的组件,里面有登录和注册按钮。
定义函数login(self):点击登录按钮时的事件,登录成功就销毁窗口。
定义函数set(self):点击注册按钮时的事件。
里面创建zhuce(Frame)类:为了创建出注册界面,注册成功就销毁窗口。
(4) 创建pick(Frame)类:(继承了Frame)
里面有单选按钮,可以选择班级和课程,点击确定按钮,就调用函数pick1(self):出现提示选班选课信息。
(5) 主函数:
连接数据库(主机:localhost用户名:root密码:root数据库名:my01端口:3306)
- 方案图:
程序流程图可参考:我上次博客。
三,程序代码
import xlrd # 导入xlrd包,对Excel读取数据
import random # 导入随机random模块
import pymysql # 导入pymysql包,对mysql数据库进行连接
from tkinter import *
from tkinter import messagebox
# 创建类:实现点名过程,创建空白表
class DianMing():
# 定义函数:从Excel文件读取学号和姓名,返回全体学号和姓名列表
def student(self, address):
data = xlrd.open_workbook(address)
table = data.sheet_by_name('Sheet1') # 选定页码1--(Sheet1)
rowNum = table.nrows # 总行数
colNum = table.ncols # 总列数
a = [] # 获得学号
b = [] # 获得姓名
for y in range(colNum): # 自动索引学号(xuehao),姓名(name)
if table.cell_value(0, y) == 'xuehao':
for x in range(1, rowNum):
vaule = table.cell_value(x, y)
vaule = float(vaule)
vaule = int(vaule)
a.append(vaule)
if table.cell_value(0, y) == 'name':
for x in range(1, rowNum):
vaule = table.cell_value(x, y)
b.append(vaule)
return a, b
# 定义函数:传入全班人数,输入想要点名人数
def num(self, length):
while True:
s = input()
if s.isdigit(): # 判断输入是否为数字,是(true),否(Flase)
num = eval(s)
if (0 <= num <= length):
return num
else:
print('超出人数(全班人数:{0})!请再次输入:'.format(length), end='')
continue
else:
print('请规范输入!再次输入点名人数(全班人数:{0}):'.format(length), end='')
continue
# 定义函数:输入列表学号,姓名,人数,进行随机点名,返回随机学号,姓名列表
def dianming(self, a, b, num):
students = dict(zip(a,b)) #化为字典,便于后面查询
d = []
e = []
c = random.sample(a, num) # 从学号列表中随机抽取不同的元素
for i in c:
d.append(i)
e.append(students[i])
return d,e
# 定义函数:输入列表学号,姓名,判断是否来了,返回点名期间早退和没来学号,姓名列表
def panduan1(self, a, b):
students = dict(zip(a, b)) # 化为字典,便于后面查询
c = []
d = []
f = []
g = []
for xuehao in a:
print('学号为{0}的学生是否来了(来:1,没来:2):'.format(xuehao), end='')
while True:
x = input()
if (x == '1'):
c.append(xuehao)
d.append(students[xuehao])
break
elif (x == '2'):
f.append(xuehao)
g.append(students[xuehao])
break
elif (x != '1' or x != '2'):
print('请规范输入!再次输入:', end='')
continue
x = self.zaotui(c,d)
y = x[0]
z = x[1]
return y,z,f,g
# 定义函数:输入列表学号,姓名,判断是否早退,返回早退学号,姓名列表
def zaotui(self, a, b):