Python制作课堂点名器,原来还能这么玩!

我们用的是Python中的Tkinter模块,我们大概做的功能有三个:

  1. 随机点名
  2. 惩罚
  3. 日志写入

首先我们先简单的把界面搭建出来,代码很简单:

import tkinter as tk
class LoveYou():
 # 初始化
 def __init__(self):
 # 第1步,建立窗口window
 self.window = tk.Tk()
 # 第2步,给窗口的可视化起名字
 self.window.title('班级考单词程序')
 # 第3步,设定窗口的大小(长*宽)
 self.window.geometry('600x400')
 self.text = tk.StringVar() # 创建str类型
 self.count = tk.StringVar()
 def take(self):
 '''
 负责随机抽取同学提问
 :return:
 '''
 pass
 def kill(self):
 '''
 负责根据星期几选择不同惩罚遍数
 :return:
 '''
 pass
 def main(self):
 '''
 主函数负责绘制
 :return:
 '''
 # 绘制筛选信息
 l2 = tk.Label(self.window, fg='red', textvariable=self.text, width=500, height=3)
 l2.config(font='Helvetica -%d bold' % 30)
 l2.pack()
 # 绘制惩罚信息
 l3 = tk.Label(self.window, fg='red', textvariable=self.count, width=500, height=3)
 l3.config(font='Helvetica -%d bold' % 20)
 l3.pack()
 # 绘制筛选按钮
 btntake = tk.Button(self.window, text="筛选", width=15, height=2, command=self.take)
 btntake.pack()
 # 绘制惩罚按钮
 btnkill = tk.Button(self.window, text="惩罚", width=15, height=2, command=self.kill)
 btnkill.pack()
 # 进入循环
 self.window.mainloop()
if __name__ == '__main__':
 loveyou = LoveYou()
 loveyou.main()

我们点击筛选按钮的时候就会执行 take 函数,此函数主要负责随机抽取同学。当我们点击惩罚按钮的时候就会执行 kill 函数,此函数主要负责惩罚同学。

Python学习群:556370268,这里是python学习者聚集地,欢迎喜欢Python的小伙伴!

三、数据获取

在班级我们一般都会有个班级人员名单(xxx.xlsx)。当我们初始化程序的时候,我们把本地的数据读取到程序中。我们在本地创建一个表格写点假数据:

通过 xlrd 模块可以把数据读取到程序中,但是我们需要安装这个模块:

pip install xlrd 

我们写个函数读取:

def read_data(self):
 '''
 数据读取
 :return:
 '''
 workbook = xlrd.open_workbook('1801.xlsx')
 sheet1 = workbook.sheet_by_index(0) # sheet索引从0开始
 data = sheet1.col_values(0) # 读取第一列内容
 # ['表格 1', '姓名', '小王', '老王', '小明', '小红', '小绿', '小青', '小陈', '小赵', '小王', '小李', '小孙', '小周', '小吴', '小钱', '小史', '小三', '小四', '小五', '小六']
 data = data.pop(0) # 把表格 1去掉
 data = data.pop(0) # 把姓名 去掉
 return data

这个函数中返回的data就是从本地读取的同学名单。

四、点名实现

我们一共设定随机次数,例如50次,直到最后随机出来的同学才当做结果。大概逻辑如下:

def take(self):
 '''
 负责随机抽取同学提问
 :return:
 '''
 for s in range(50):
 '''
 后几秒慢点,制造紧张气氛
 '''
 desc = ''
 if s == 47:
 time.sleep(0.5)
 elif s == 48:
 time.sleep(0.6)
 elif s == 48:
 time.sleep(0.7)
 elif s == 49:
 time.sleep(0.9)
 else:
 time.sleep(0.1)
 classes = random.sample(self.data, 2)
 desc += "呦,你被上帝选中了:%s\n" % classes[0]
 desc += "呦,你看着也很不错呀:%s\n" % classes[1]
 self.text.set(desc) # 设置内容
 self.window.update() # 屏幕更新

下面是动态图展示:

五、惩罚实现

我们根据周一到周五,每天惩罚的量不一样,惩罚的方式暂定抄写吧。

def kill(self):
 '''
 负责根据星期几选择不同惩罚遍数
 :return:
 '''
 if self.day == 1:
 count = random.randint(50, 100)
 kill_desc = "上帝奖励了你们组%d遍" % (count)
 elif self.day == 2:
 count = random.randint(50, 120)
 kill_desc = "上帝奖励了你们组%d遍" % (count)
 self.count.set(kill_desc)
 elif self.day == 3:
 count = random.randint(50, 140)
 kill_desc = "上帝奖励了你们组%d遍" % (count)
 elif self.day == 4:
 count = random.randint(50, 160)
 kill_desc = "上帝奖励了你们组%d遍" % (count)
 self.count.set(kill_desc)
 elif self.day == 5:
 count = random.randint(50, 180)
 kill_desc = "上帝奖励了你们组%d遍" % (count)
 else:
 kill_desc = '周末就别提问了'
 self.count.set(kill_desc) # 设置内容
 self.window.update() # 屏幕更新

当我们点击筛选后,再点击惩罚,就出现罚写的遍数了。

六、日志实现

日志主要为了记录提问的人、什么时候提问的、罚写的遍数。我们都要把这些信息写入到本地,要不第二天老师忘记考谁了,学生也不承认提问我了,所以日志功能是必须的。

当最终提问人确定的时候调用 savedesc 函数

当点击惩罚按钮的时候调用 savecount 函数

def savedesc(self, desc):
 '''
 负责把选中的人写入到log里面
 :param desc:
 :return:
 '''
 with open('log.txt', 'a', encoding='utf-8') as f:
 f.write(self.gettime() + "\n" + desc)
 def savecount(self, count):
 '''
 负责把被罚写的遍数写入到log里面
 :param count:
 :return:
 '''
 with open('log.txt', 'a', encoding='utf-8') as f:
 f.write(str(count) + '\n')
 f.write('--------------------------------\n')

本地文件格式如下:

有个记录挺好的,省着赖账。

Python学习群:556370268,这里是python学习者聚集地,欢迎喜欢Python的小伙伴!

七、其他

基本功能就这些,我在界面上加了一些提示。比如今天的日期了,班级人数等等这些。

全部代码:

import tkinter as tk
import xlrd
import time
import random
import datetime
class LoveYou():
 # 初始化
 def __init__(self):
 # 第1步,建立窗口window
 self.window = tk.Tk()
 # 第2步,给窗口的可视化起名字
 self.window.title('班级考单词程序')
 # 第3步,设定窗口的大小(长*宽)
 self.window.geometry('600x400')
 self.text = tk.StringVar() # 创建str类型
 self.count = tk.StringVar()
 self.data = self.read_data()
 # 获取星期几
 d = datetime.datetime.now()
 self.day = d.weekday() + 1
 def read_data(self):
 '''
 数据读取
 :return:
 '''
 workbook = xlrd.open_workbook('1801.xlsx')
 sheet1 = workbook.sheet_by_index(0) # sheet索引从0开始
 data = list(sheet1.col_values(0)) # 读取第一列内容
 # ['表格 1', '姓名', '小王', '老王', '小明', '小红', '小绿', '小青', '小陈', '小赵', '小王', '小李', '小孙', '小周', '小吴', '小钱', '小史', '小三', '小四', '小五', '小六']
 data.pop(0) # 把表格 1去掉
 data.pop(0) # 把姓名 去掉
 return data
 def take(self):
 '''
 负责随机抽取同学提问
 :return:
 '''
 for s in range(50):
 '''
 后几秒慢点,制造紧张气氛
 '''
 desc = ''
 if s == 47:
 time.sleep(0.5)
 elif s == 48:
 time.sleep(0.6)
 elif s == 48:
 time.sleep(0.7)
 elif s == 49:
 time.sleep(0.9)
 else:
 time.sleep(0.1)
 classes = random.sample(self.data, 2)
 desc += "呦,你被上帝选中了:%s\n" % classes[0]
 desc += "呦,你看着也很不错呀:%s\n" % classes[1]
 if s == 49:
 self.savedesc(desc) # 写入日志
 self.text.set(desc) # 设置内容
 self.window.update() # 屏幕更新
 def kill(self):
 '''
 负责根据星期几选择不同惩罚遍数
 :return:
 '''
 if self.day == 1:
 count = random.randint(50, 100)
 kill_desc = "上帝奖励了你们组%d遍" % (count)
 elif self.day == 2:
 count = random.randint(50, 120)
 kill_desc = "上帝奖励了你们组%d遍" % (count)
 self.count.set(kill_desc)
 elif self.day == 3:
 count = random.randint(50, 140)
 kill_desc = "上帝奖励了你们组%d遍" % (count)
 elif self.day == 4:
 count = random.randint(50, 160)
 kill_desc = "上帝奖励了你们组%d遍" % (count)
 self.count.set(kill_desc)
 elif self.day == 5:
 count = random.randint(50, 180)
 kill_desc = "上帝奖励了你们组%d遍" % (count)
 else:
 kill_desc = '周末就别提问了'
 self.count.set(kill_desc) # 设置内容
 self.window.update() # 屏幕更新
 self.savecount(kill_desc) # 写入日志
 def gettime(self):
 '''
 格式化时间
 :return:
 '''
 return time.strftime('%Y-%m-%d', time.localtime(time.time())) + " 星期" + str(self.day)
 def savedesc(self, desc):
 '''
 负责把选中的人写入到log里面
 :param desc:
 :return:
 '''
 with open('log.txt', 'a', encoding='utf-8') as f:
 f.write(self.gettime() + "\n" + desc)
 def savecount(self, count):
 '''
 负责把被罚写的遍数写入到log里面
 :param count:
 :return:
 '''
 with open('log.txt', 'a', encoding='utf-8') as f:
 f.write(str(count) + '\n')
 f.write('--------------------------------\n')
 def main(self):
 '''
 主函数负责绘制
 :return:
 '''
 # 绘制日期、班级总人数等
 now = time.strftime('%Y-%m-%d', time.localtime(time.time())) + " 星期" + str(self.day)
 now += "\n班级总人数:%s人" % str(len(self.data))
 now += "\n正在合理计算中\n"
 l1 = tk.Label(self.window, fg='red', text=now, width=500, height=5)
 l1.config(font='Helvetica -%d bold' % 15)
 l1.pack() # 安置标签
 # 绘制筛选信息
 l2 = tk.Label(self.window, fg='red', textvariable=self.text, width=500, height=3)
 l2.config(font='Helvetica -%d bold' % 30)
 l2.pack()
 # 绘制惩罚信息
 l3 = tk.Label(self.window, fg='red', textvariable=self.count, width=500, height=3)
 l3.config(font='Helvetica -%d bold' % 20)
 l3.pack()
 # 绘制筛选按钮
 btntake = tk.Button(self.window, text="筛选", width=15, height=2, command=self.take)
 btntake.pack()
 # 绘制惩罚按钮
 btnkill = tk.Button(self.window, text="惩罚", width=15, height=2, command=self.kill)
 btnkill.pack()
 # 进入循环
 self.window.mainloop()
if __name__ == '__main__':
 loveyou = LoveYou()
 loveyou.main()

猜你喜欢

转载自blog.csdn.net/weixin_44369414/article/details/88647491