基于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实现的防DDoS脚本
Feb 08 Python
python获取元素在数组中索引号的方法
Jul 15 Python
在Django的视图(View)外使用Session的方法
Jul 23 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
Mar 13 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
详解python数据结构和算法
Apr 18 Python
Python3中_(下划线)和__(双下划线)的用途和区别
Apr 26 Python
使用python的turtle绘画滑稽脸实例
Nov 21 Python
python将三维数组展开成二维数组的实现
Nov 30 Python
python 通过手机号识别出对应的微信性别(实例代码)
Dec 22 Python
Django中使用Celery的方法步骤
Dec 07 Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 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去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
JavaScript函数详解
2015/02/27 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
Django 路由控制的实现
2019/07/17 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
Python print不能立即打印的解决方式
2020/02/19 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
什么是Rollback Segment
2013/04/22 面试题
情况说明书格式范文
2014/05/06 职场文书
新学期国旗下演讲稿
2014/05/08 职场文书
超越自我演讲稿
2014/05/21 职场文书
党风廉正建设责任书
2015/01/29 职场文书
适合青年人白手起家的创业项目分享
2019/08/16 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL