基于python tkinter的课堂点名小程序
import datetime
import json
import os
import random
import tkinter as tk
import openpyxl # 花名册文件名
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:101677771
excel_file_path = "花名册.xlsx"#需在当前目录创建对应花名册.xlsx
# 工作表名
excel_sheet = "Sheet1"
# 记录存储文件名
file_path = "name_record.json" #封装业务逻辑
class Call_Name:
# 私有化变量
_namelist = None
# 读取花名册
def __init__(self):
wb = openpyxl.load_workbook(excel_file_path)
get_sheet = wb[excel_sheet]
list_data = []
first_row = True
try:
for row in get_sheet:
# 忽略首行
if first_row:
first_row = False
continue
# 读取第一个单元格数据
for lab in row:
list_data.append(lab.value)
break
except:
list_data = ['空名单?']
self._namelist = list_data # 初始化记录
def _re_reset(self):
# 记录使用日期
dls = []
dy = str(datetime.datetime.today().date())
dls.append(dy)
# 记录点名
record = {}
for i in self._namelist:
record[i] = 0
name_record = {"date": dls, "last_use": dy, "record": record}
return name_record # 创建记录
def mk_record(self):
jf_dict = self._re_reset()
with open(file=file_path, mode='w', encoding='utf-8') as jf:
json.dump(jf_dict, jf, indent=2, sort_keys=True, ensure_ascii=False) # 读取记录
def read_record(self):
with open(file=file_path, mode='r', encoding='utf-8') as jf:
jf_data = json.load(jf)
return jf_data # 产生随机姓名
def call_name(self):
ll = len(self._namelist)
num = random.randint(1, ll)
call_name = self._namelist[num - 1]
return call_name # 修改记录-----warning!!!
def re_mod(self, name=None, re_date=None):
jf_data = self.read_record()
record = jf_data["record"]
use_date = list(jf_data["date"])
if name:
v = record[name] + 1
jf_data["record"][name] = v
if re_date:
use_date.append(re_date)
jf_data["date"] = use_date
jf_data["last_use"] = re_date
with open(file=file_path, mode='w', encoding='utf-8') as jf:
json.dump(jf_data, jf, indent=2, sort_keys=True, ensure_ascii=False) # 获取记录次数
def re_times(self):
times_list = []
record = self.read_record()["record"]
for k, v in record.items():
times_list.append(v)
return times_list # 返回记录次数 # 获取被点到成员记录次数
def call_times(self, name):
record = self.read_record()["record"]
return record[name] #封装事件
class ForGUI:
# 初始化
re_date = None def __init__(self):
try:
cname = Call_Name()
except:
msg["text"] = "未找到:%s" % excel_file_path
msg.update()
else:
try:
record = cname.read_record() # 读取记录
except:
cname.mk_record() # 读取异常则重新创建记录
record = cname.read_record()
self.re_date = record["date"] # 获取使用日期记录
# 每5天初始化一次记录
if len(self.re_date) > 5:
cname.mk_record() # 重新创建记录 # 开始点名,输出有效姓名:姓名对应记录不为最大次数
def start(self):
cname = Call_Name()
times = cname.re_times() # 获取记录次数
max_times = max(times) # 获取记录最大次数
min_times = min(times) # 获取记录最小次数
td = str(datetime.datetime.today().date()) # 获取当前日期
if not td in self.re_date:
cname.re_mod(re_date=td)
while True:
name = cname.call_name() # 产生随机姓名
times = cname.call_times(name) # 获取被点到成员记录次数
if max_times != min_times:
if times != max_times:
cname.re_mod(name=name) # 修改记录
msg["text"] = name
msg.update()
break
else:
continue
else:
cname.re_mod(name=name) # 修改记录
msg["text"] = name
msg.update()
break # 查看花名册
def open_name_excel(self):
try:
os.system("start %s&exit" % excel_file_path)
except:
msg["text"] = '\n未找到花名册╮(╯▽╰)╭\n'
msg["font"] = ('', 18)
msg.update() # 查看点名记录
def open_record(self):
try:
os.system("start %s&exit" % file_path)
except:
msg["text"] = '\n未找到点名记录╮(╯▽╰)╭\n'
msg["font"] = ('', 18)
msg.update() # 获取花名册名单
def get_name_list(self):
try:
wb = openpyxl.load_workbook(excel_file_path)
get_sheet = wb[excel_sheet]
except:
msg["text"] = "未找到:%s" % excel_file_path
msg.update()
else:
list_data = []
first_row = True
for row in get_sheet:
# 忽略首行
if first_row:
first_row = False
continue
# 读取第一个单元格数据
for lab in row:
list_data.append(lab.value)
break
return list_data # 创建窗口
root = tk.Tk(className="点名工具")
# 设置窗口大小
setWidth = 300
setHeight = 180
# 获取屏幕分辨率
screenWidth = root.winfo_screenwidth()
screenHeight = root.winfo_screenheight() x = int((screenWidth - setWidth) / 2)
y = int((screenHeight - setHeight) / 2)
# 设置窗口初始位置屏幕居中
root.geometry("%sx%s+%s+%s" % (setWidth, setHeight, x, y))
# 设置窗口宽高固定
root.resizable(0, 0)
# 创建菜单栏
m1 = tk.Menu(root, tearoff=False)
# 创建子菜单,不显示分窗
MenuBar = tk.Menu(m1, tearoff=False)
MenuBar.add_command(label='查看名单', command=ForGUI().open_name_excel)
MenuBar.add_command(label='查看记录', command=ForGUI().open_record)
MenuBar.add_command(label='清空记录', command=Call_Name().mk_record) # 将子菜单加入菜单栏中
m1.add_cascade(label='选项', menu=MenuBar)
m1.add_command(label='Exit', command=root.quit)
# 将菜单栏添加到窗口
root.config(menu=m1)
# 创建文本显示
f1 = tk.Frame(root, bd=1, height=150, width=200)
pass
f1.pack(pady=10)
msg = tk.Label(f1, text="\n别紧张(●ˇ∀ˇ●)\n", fg="green") # 创建文本控件
msg.pack(pady=10)
msg["font"] = ('', 18)
f2 = tk.Frame(root)
f2.pack(pady=10) # 循环随机显示花名册名单
name_list = ForGUI().get_name_list()
def info():
t = random.randint(1, len(name_list))
msg["font"] = ('', 44)
msg["text"] = (name_list[t - 1]) def bt_listen():
while bt["state"] == 'normal':
bt['command'] = bt_start
bt['text'] = "就决定是你了"
root.after(500, info)
bt.update()
if bt['text'] == "开始":
break
基于python tkinter的课堂点名小程序的更多相关文章
- java实现课堂随机点名小程序
通过jdbc连接数据库实现读取学生花名册进行随机点名! ~jdbc连接mysql数据库 || 注释部分代码可通过读取.txt文档实现显示学生信息 ~通过点击开始按钮实现界面中间标签不断更新学生信息 ...
- 基于php基础语言编写的小程序之计算器
基于php基础语言编写的小程序之计算器 需求:在输入框中输入数字进行加.减.乘.除运算(html+php) 思路: 1首先要创建输入数字和运算符的输入框,数字用input的text属性,运算符用sel ...
- [干货教程]仿网易云课堂微信小程序开发实战经验
本篇文章想跟大家分享下:我们公司“湖北诚万兴科技”最近刚帮客户定制开发.目前已上线的“哎咆课堂”微信小程序的开发经验分享.首先大概介绍下这个小程序所涉及到的主要技术点:微信登录.微信支付.微信小程序F ...
- 基于spring-boot的社区社交微信小程序,适合做脚手架、二次开发
基于spring-boot的社区社交微信小程序,适合做脚手架.二次开发 代码地址如下:http://www.demodashi.com/demo/13867.html 1 概述 笔者做的一个后端基于s ...
- Python——免费观看全网视频小程序
说明,这个小程序是基于网站“全民解析”,调用该网站的接口,实现数据传输观看视频,若该网站凉凉,则此程序凉凉. 开始之前的分析: 进入全民解析网站,我们首先查看一下网页的html代码,发现该站观看视频的 ...
- 用 python 写一个年会抽奖小程序
使用 pyinstaller 打包工具常用参数指南 pyinstaller -F demo.py 参数 含义 -F 指定打包后只生成一个exe格式的文件 -D –onedir 创建一个目录,包含exe ...
- python学习笔记(2)——练习小程序之 " input " 隐藏陷阱
练习小程序之 ----------" input " 隐藏陷阱 age=input('please enter your age:') if age>=18: print(' ...
- [Chat]实战:仿网易云课堂微信小程序开发核心技术剖析和经验分享
本Chat以一个我参与开发并已上线运营近2年——类似网易云课堂的微信小程序项目,来进行微信小程序高级开发的学习. 本场Chat围绕项目开发核心技术分析,帮助你快速掌握在线视频.音频类小程序开发所需要的 ...
- 随机点名小程序--- -JAVA版本
话不多少,直接上代码 一个能够直接运行的随机点名的小程序,一个界面化的小程序.望广大网友多多支持! 1.创建一个随机点名的类 public class ProcessRandomName { JFra ...
随机推荐
- SparkSQL & Spark on Hive & Hive on Spark
刚开始接触Spark被Hive在Spark中的作用搞得云里雾里,这里简要介绍下,备忘. 参考:https://blog.csdn.net/zuochang_liu/article/details/82 ...
- cmd批处理bat命令根据端口号一键关闭杀死对应进程程序
@ 目录 cmd批处理bat命令根据端口号一键关闭杀死对应进程程序 使用场景和功能介绍 主界面 下载地址 源代码 cmd批处理bat命令根据端口号一键关闭杀死对应进程程序 使用场景和功能介绍 java ...
- Springboot 在@Configuration注解的勒种 使用@Autowired或者@value注解 读取.yml属性失败
springboot中@value注解,读取yml属性失败 问题场景: 配置ShrioConfig时,想注入.yml的参数进行配置 解决办法: 如果注释掉shiroEhcacheManager 以下所 ...
- Iconfont的代码使用
1.Iconfont官网 相关阅读: Iconfont-阿里巴巴矢量图标库 Iconfont-阿里巴巴矢量图标库-代码使用 2.下载代码 注意到把鼠标悬停到图标上,会出现三个按钮. 我们点击" ...
- 我搭的神经网络不work该怎么办!看看这11条新手最容易犯的错误
1. 忘了数据规范化 2. 没有检查结果 3. 忘了数据预处理 4. 忘了正则化 5. 设置了过大的批次大小 6. 使用了不适当的学习率 7. 在最后一层使用了错误的激活函数 8. 网络含有不良梯度 ...
- Java—Map接口中的常用方法
Map接口与Collection接口的区别 Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储. Map中的集合,元素是成对存在的(理解为夫妻).每 ...
- 2020-06-21:ZK的哪些基础能力构建出了哪些上层应用?
福哥答案2020-06-21: 福哥口诀法:数负命Ma集配分(使用场景:数据发布订阅.负载均衡.命名服务.Master 选举.集群管理.配置管理.分布式队列和分布式锁) 数据发布订阅:dubbo的rp ...
- C#图解教程(第四版)—01—类型,存储,变量
3.1 如何广泛的描述C#程序 可以说C程序是一组函数和数据类型,C++程序是一组函数和类,然而C#程序是一组类型声明 3.2 类型 可以把类型想象成一个用来创建数据结构的模板,模板本身并不是数据结构 ...
- Python定时任务轻量解决方案---Schedule
写后端的同学们可能都知道,工作中可能需要周期性执行一些任务,俗称定时任务.Linux环境下,可以借助于系统自带的crontab完成定时任务.但是很多时候,开发的同学们可能并没有权限去操作crontab ...
- 运用sklearn进行线性判别分析(LDA)代码实现
基于sklearn的线性判别分析(LDA)代码实现 一.前言及回顾 本文记录使用sklearn库实现有监督的数据降维技术——线性判别分析(LDA).在上一篇LDA线性判别分析原理及python应用(葡 ...