基于python tkinter的点名小程序功能的实例代码


Posted in Python onAugust 22, 2020

代码如下所示:

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 tkinter点名小程序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
Django 根据数据模型models创建数据表的实例
May 27 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
解决python3捕获cx_oracle抛出的异常错误问题
Oct 18 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
python GUI图形化编程wxpython的使用
Jul 19 Python
基于django传递数据到后端的例子
Aug 16 Python
Pytorch之卷积层的使用详解
Dec 31 Python
python无序链表删除重复项的方法
Jan 17 Python
Python利用PyPDF2库获取PDF文件总页码实例
Apr 03 Python
Python之matplotlib绘制饼图
Apr 13 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
Aug 22 #Python
python进度条显示之tqmd模块
Aug 22 #Python
python 常见的排序算法实现汇总
Aug 21 #Python
Python制作数据预测集成工具(值得收藏)
Aug 21 #Python
简述 Python 的类和对象
Aug 21 #Python
DRF框架API版本管理实现方法解析
Aug 21 #Python
Django rest framework分页接口实现原理解析
Aug 21 #Python
You might like
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
JavaScript实现删除数组重复元素的5种常用高效算法总结
2018/01/18 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
2018/07/18 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
2018/12/02 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
python实现dict版图遍历示例
2014/02/19 Python
Python基础语言学习笔记总结(精华)
2017/11/14 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
python常用数据重复项处理方法
2019/11/22 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
Python gevent协程切换实现详解
2020/09/14 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
2016/12/22 HTML / CSS
会计专业应届生求职信
2013/11/24 职场文书
网上蛋糕店创业计划书
2014/01/24 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
年检委托书
2014/08/30 职场文书
出国留学英文自荐信
2015/03/25 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
Go各时间字符串使用解析
2021/04/02 Golang