基于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模拟登陆Tom邮箱示例分享
Jan 13 Python
python打开url并按指定块读取网页内容的方法
Apr 29 Python
python获得文件创建时间和修改时间的方法
Jun 30 Python
浅谈Python中的闭包
Jul 08 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
Sep 17 Python
Python批处理更改文件名os.rename的方法
Oct 26 Python
python使用celery实现异步任务执行的例子
Aug 28 Python
python解析yaml文件过程详解
Aug 30 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
在python中实现导入一个需要传参的模块
May 12 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
德劲1107的电路分析与打磨
2021/03/02 无线电
Discuz! Passport 通行证整合
2008/03/27 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
一个简单的php路由类
2016/05/29 PHP
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
2015/11/30 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
js实现登录验证码
2016/12/22 Javascript
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
python进阶教程之循环对象
2014/08/30 Python
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
Python实现单词拼写检查
2015/04/25 Python
详解Python中的条件判断语句
2015/05/14 Python
python如何对实例属性进行类型检查
2018/03/20 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
python批量修改xml属性的实现方式
2020/03/05 Python
jupyter 导入csv文件方式
2020/04/21 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
党员批评与自我批评材料
2014/10/14 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript