python利用tkinter實(shí)現(xiàn)一個(gè)點(diǎn)名小程序功能-創(chuàng)新互聯(lián)

這篇文章運(yùn)用簡單易懂的例子給大家介紹python利用tkinter實(shí)現(xiàn)一個(gè)點(diǎn)名小程序功能,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

十年專注成都網(wǎng)站制作,成都定制網(wǎng)站,個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都定制網(wǎng)站,高端網(wǎng)頁制作,對成都建筑動(dòng)畫等多個(gè)方面,擁有多年的網(wǎng)站運(yùn)維經(jīng)驗(yàn)。

代碼如下所示:

import datetime
import json
import os
import random
import tkinter as tk
import openpyxl

# 花名冊文件名
excel_file_path = "花名冊.xlsx"#需在當(dāng)前目錄創(chuàng)建對應(yīng)花名冊.xlsx
# 工作表名
excel_sheet = "Sheet1"
# 記錄存儲(chǔ)文件名
file_path = "name_record.json"

#封裝業(yè)務(wù)邏輯
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
    # 讀取第一個(gè)單元格數(shù)據(jù)
    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)
  # 記錄點(diǎn)名
  record = {}
  for i in self._namelist:
   record[i] = 0
  name_record = {"date": dls, "last_use": dy, "record": record}
  return name_record

 # 創(chuàng)建記錄
 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

 # 產(chǎn)生隨機(jī)姓名
 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)

 # 獲取記錄次數(shù)
 def re_times(self):
  times_list = []
  record = self.read_record()["record"]
  for k, v in record.items():
   times_list.append(v)
  return times_list # 返回記錄次數(shù)

 # 獲取被點(diǎn)到成員記錄次數(shù)
 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() # 讀取異常則重新創(chuàng)建記錄
    record = cname.read_record()
   self.re_date = record["date"] # 獲取使用日期記錄
   # 每5天初始化一次記錄
   if len(self.re_date) > 5:
    cname.mk_record() # 重新創(chuàng)建記錄

 # 開始點(diǎn)名,輸出有效姓名:姓名對應(yīng)記錄不為大次數(shù)
 def start(self):
  cname = Call_Name()
  times = cname.re_times() # 獲取記錄次數(shù)
  max_times = max(times) # 獲取記錄大次數(shù)
  min_times = min(times) # 獲取記錄最小次數(shù)
  td = str(datetime.datetime.today().date()) # 獲取當(dāng)前日期
  if not td in self.re_date:
   cname.re_mod(re_date=td)
  while True:
   name = cname.call_name() # 產(chǎn)生隨機(jī)姓名
   times = cname.call_times(name) # 獲取被點(diǎn)到成員記錄次數(shù)
   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()

 # 查看點(diǎn)名記錄
 def open_record(self):
  try:
   os.system("start %s&exit" % file_path)
  except:
   msg["text"] = '\n未找到點(diǎ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
    # 讀取第一個(gè)單元格數(shù)據(jù)
    for lab in row:
     list_data.append(lab.value)
     break
   return list_data

# 創(chuàng)建窗口
root = tk.Tk(className="點(diǎn)名工具")
# 設(shè)置窗口大小
setWidth = 300
setHeight = 180
# 獲取屏幕分辨率
screenWidth = root.winfo_screenwidth()
screenHeight = root.winfo_screenheight()

x = int((screenWidth - setWidth) / 2)
y = int((screenHeight - setHeight) / 2)
# 設(shè)置窗口初始位置屏幕居中
root.geometry("%sx%s+%s+%s" % (setWidth, setHeight, x, y))
# 設(shè)置窗口寬高固定
root.resizable(0, 0)
# 創(chuàng)建菜單欄
m1 = tk.Menu(root, tearoff=False)
# 創(chuàng)建子菜單,不顯示分窗
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='選項(xiàng)', menu=MenuBar)
m1.add_command(label='Exit', command=root.quit)
# 將菜單欄添加到窗口
root.config(menu=m1)
# 創(chuàng)建文本顯示
f1 = tk.Frame(root, bd=1, height=150, width=200)
pass
f1.pack(pady=10)
msg = tk.Label(f1, text="\n別緊張(●ˇ∀ˇ●)\n", fg="green") # 創(chuàng)建文本控件
msg.pack(pady=10)
msg["font"] = ('', 18)
f2 = tk.Frame(root)
f2.pack(pady=10)

# 循環(huán)隨機(jī)顯示花名冊名單
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()

# 創(chuàng)建開始按鈕
bt = tk.Button(f2, text='開始點(diǎn)名嘍', stat="normal", command=bt_listen, bd=4, width=20, font=18)
bt.pack()
root.mainloop()

當(dāng)前文章:python利用tkinter實(shí)現(xiàn)一個(gè)點(diǎn)名小程序功能-創(chuàng)新互聯(lián)
標(biāo)題URL:http://muchs.cn/article30/eidpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、移動(dòng)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)手機(jī)網(wǎng)站建設(shè)、虛擬主機(jī)、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司