基于python tkinter的点名小程序
import datetime
import json
import os
import random
import tkinter as tk
import openpyxl # 花名册文件名
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
def bt_start():
bt['command'] = bt_listen
bt['text'] = "开始"
fg = ForGUI()
root.after(500, fg.start)
bt.update() # 创建开始按钮
bt = tk.Button(f2, text='开始点名喽', stat="normal", command=bt_listen, bd=4, width=20, font=18)
bt.pack()
root.mainloop()
基于python tkinter的点名小程序的更多相关文章
- python实现串口通讯小程序(GUI界面)
python实现串口通讯小程序(GUI界面) 使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装. 1.安装p ...
- 基于Shiro,JWT实现微信小程序登录完整例子
小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html ...
- java实现课堂随机点名小程序
通过jdbc连接数据库实现读取学生花名册进行随机点名! ~jdbc连接mysql数据库 || 注释部分代码可通过读取.txt文档实现显示学生信息 ~通过点击开始按钮实现界面中间标签不断更新学生信息 ...
- CRMEB系统就是集客户关系管理+营销电商系统,能够真正帮助企业基于微信公众号、小程序实现会员管理、数据分析,精准营销的电子商务管理系统。可满足企业新零售、批发、分销、等各种业务需求。
**可以快速二次开发的开源小程序商城系统源码**源码开源地址:https://github.crmeb.net/u/LXT 项目介绍: CRMEB系统就是集客户关系管理+营销电商系统,能够真正帮助企业 ...
- Python flask构建微信小程序订餐系统
第1章 <Python Flask构建微信小程序订餐系统>课程简介 本章内容会带领大家通览整体架构,功能模块,及学习建议.让大家在一个清晰的开发思路下,进行后续的学习.同时领着大家登陆ht ...
- 基于 Autojs 的 APP、小程序自动化测试 SDK
原文:https://blog.csdn.net/laobingm/article/details/98317394 autojs sdk基于 Autojs 的 APP.小程序自动化测试 SDK,支持 ...
- 基于 Autojs 的 APP、小程序自动化测试 SDK - 2019年8月3日
原文:https://blog.csdn.net/laobingm/article/details/98317394 autojs sdk基于 Autojs 的 APP.小程序自动化测试 SDK,支持 ...
- Python flask构建微信小程序订餐系统☝☝☝
Python flask构建微信小程序订餐系统☝☝☝ 一.Flask MVC框架结构 1.1实际项目结构 1.2application.py 项目配置文件 Flask之flask-script模块使 ...
- Python flask构建微信小程序订餐系统✍✍✍
Python flask构建微信小程序订餐系统 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题, ...
随机推荐
- kafka笔记——kafka启动
1. 准备 阿里云Linux服务器一个(Centos7) 腾讯云Linux服务器一个(CentOs7) zookeeper,kafka压缩包 Java环境配置好 要死....脚本之家 2. 安装 zo ...
- 从RNN到BERT
一.文本特征编码 1. 标量编码 美国:1 中国:2 印度:3 … 朝鲜:197 标量编码问题:美国 + 中国 = 3 = 印度 2. One-hot编码 美国:[1,0,0,0,…,0]中国:[0, ...
- Python while 循环中使用 else 语句
Python while 循环中使用 else 语句: else:表示 while 中的语句正常执行完,然后执行 else 语句的部分. 示例: # while 判断条件: # 一行语句 或 多行语句 ...
- 如何验证 names(名称), e-mails(邮件), 和 URLs
PHP 表单 - 验证邮件和URL 本章节我们将介绍如何验证 names(名称), e-mails(邮件), 和 URLs. PHP - 验证名称 以下代码将通过简单的方式来检测 name 字段是否包 ...
- Python os.write() 方法
write()方法语法格式如下:高佣联盟 www.cgewang.com os.write(fd, str) 参数 fd -- 文件描述符. str -- 写入的字符串. 返回值 该方法返回写入的实际 ...
- PHP array_udiff() 函数
实例 比较两个数组的键值(使用用户自定义函数比较键值),并返回差集: <?phpfunction myfunction($a,$b){if ($a===$b){return 0;}return ...
- Skill 脚本演示 ycLayerExcel.il
https://www.cnblogs.com/yeungchie/ ycLayerExcel.il 用于 Tape-out 流程,获取当前用到的所有 lpp 等信息,并按照自定格式输出为 Excel ...
- Phantomjs实现后端生成图片文件
目录 PhantomJS简介 了解rasterize.js 使用方法 今天,给大家分享一个Java后端利用Phantomjs实现生成图片的功能,同学们使用的时候,可以参考下! PhantomJS简介 ...
- 面试必问的volatile关键字
原文: 卡巴拉的树 https://juejin.im/post/5a2b53b7f265da432a7b821c 在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度, ...
- ubuntu18.04右键怎么添加新建空白文本文件
安装好ubuntu18.04发现右键菜单中没有新建空白文件了,这样工作的时候需要创建文本文件就不是很方便了,这里我们就可以通过以下的方式把新建空白文件添加到右键 解决办法: 1.打开文件夹,在用户主目 ...