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的点名小程序的更多相关文章

  1. python实现串口通讯小程序(GUI界面)

    python实现串口通讯小程序(GUI界面) 使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装. 1.安装p ...

  2. 基于Shiro,JWT实现微信小程序登录完整例子

    小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html ...

  3. java实现课堂随机点名小程序

    通过jdbc连接数据库实现读取学生花名册进行随机点名! ~jdbc连接mysql数据库  ||  注释部分代码可通过读取.txt文档实现显示学生信息 ~通过点击开始按钮实现界面中间标签不断更新学生信息 ...

  4. CRMEB系统就是集客户关系管理+营销电商系统,能够真正帮助企业基于微信公众号、小程序实现会员管理、数据分析,精准营销的电子商务管理系统。可满足企业新零售、批发、分销、等各种业务需求。

    **可以快速二次开发的开源小程序商城系统源码**源码开源地址:https://github.crmeb.net/u/LXT 项目介绍: CRMEB系统就是集客户关系管理+营销电商系统,能够真正帮助企业 ...

  5. Python flask构建微信小程序订餐系统

    第1章 <Python Flask构建微信小程序订餐系统>课程简介 本章内容会带领大家通览整体架构,功能模块,及学习建议.让大家在一个清晰的开发思路下,进行后续的学习.同时领着大家登陆ht ...

  6. 基于 Autojs 的 APP、小程序自动化测试 SDK

    原文:https://blog.csdn.net/laobingm/article/details/98317394 autojs sdk基于 Autojs 的 APP.小程序自动化测试 SDK,支持 ...

  7. 基于 Autojs 的 APP、小程序自动化测试 SDK - 2019年8月3日

    原文:https://blog.csdn.net/laobingm/article/details/98317394 autojs sdk基于 Autojs 的 APP.小程序自动化测试 SDK,支持 ...

  8. Python flask构建微信小程序订餐系统☝☝☝

    Python flask构建微信小程序订餐系统☝☝☝ 一.Flask MVC框架结构 1.1实际项目结构 1.2application.py  项目配置文件 Flask之flask-script模块使 ...

  9. Python flask构建微信小程序订餐系统✍✍✍

    Python flask构建微信小程序订餐系统  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题, ...

随机推荐

  1. zabbix修改默认密码

    1.mysql -u root -p 2.desc users; 3.select userid,alias,passwd from users; 4.update users set passwd= ...

  2. http与https的简单比较

    一.概念 1.HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减 ...

  3. OceanBase安装和使用

    链接 https://mp.weixin.qq.com/s?spm=a2c6h.12873639.0.0.41f92c9bH5FL2Y&__biz=MzU3OTc2MDQxNg==&m ...

  4. ImportError: /lib64/libm.so.6: version `CXXAB_1.3.8.' not found (required by /usr/local/python37/lib/python3.7/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so)

    问题背景 使用在AI项目中,由于需要用到tensorflow,scipy,sklearn等这些库,所以需要libstdc++库. 问题原因 这个问题的出现与写的代码无关,只与操作系统的libstdc+ ...

  5. 02_Linux实操篇

    第五章 VI和VIM编辑器 5.1. VI和VIM基本介绍 Vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器.由于对Unix及Linux系统的任何版本,Vi ...

  6. PHP fileatime() 函数

    定义和用法 fileatime() 函数返回指定文件的上次访问时间. 如果成功,该函数将以 Unix 时间戳形式返回文件的上次访问时间.如果失败,则返回 FALSE. 语法 fileatime(fil ...

  7. PHP fgetcsv() 函数

    定义和用法 fgetcsv() 函数从打开的文件中解析一行,校验 CSV 字段. fgetcsv() 函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止返回一个新行. 该函数如果成功 ...

  8. .net core编写转发服务(二) 添加服务发布订阅

    源设计就单纯完成了把服务转发到特定的服务模块,一定程度上解耦了业务流程 但是我们实际开发过程中会面临服务转发后还有一些列关联的服务 举个例子 你调用了发送邮件的服务,接下来会面临扣费的服务,扣费之后会 ...

  9. 使用DEBUG 读取主引导记录

    实验环境:win7 64位(虚拟机) 由于此版本不能直接在命令行使用DOS,需要下载相关软件,参考https://www.cnblogs.com/caishunzhe/p/12823201.html ...

  10. JS笔记 语法

    javascript概述 简称为JS,是一款能够运行在JS解释器.引擎中的脚本语言 JS解释器.引擎 JS的运行环境 1.独立安装的js解释器 -nodeJS 2.嵌入在浏览器中的js解释器 JS基于 ...