這篇文章運(yùn)用簡(jiǎn)單易懂的例子給大家介紹python利用tkinter實(shí)現(xiàn)一個(gè)點(diǎn)名小程序功能,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
代碼如下所示:
import datetime import json import os import random import tkinter as tk import openpyxl # 花名冊(cè)文件名 excel_file_path = "花名冊(cè).xlsx"#需在當(dāng)前目錄創(chuàng)建對(duì)應(yīng)花名冊(cè).xlsx # 工作表名 excel_sheet = "Sheet1" # 記錄存儲(chǔ)文件名 file_path = "name_record.json" #封裝業(yè)務(wù)邏輯 class Call_Name: # 私有化變量 _namelist = None # 讀取花名冊(cè) 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)名,輸出有效姓名:姓名對(duì)應(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 # 查看花名冊(cè) def open_name_excel(self): try: os.system("start %s&exit" % excel_file_path) except: msg["text"] = '\n未找到花名冊(cè)╮(╯▽╰)╭\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() # 獲取花名冊(cè)名單 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ī)顯示花名冊(cè)名單 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://vcdvsql.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)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容