基于python tkinter的點(diǎn)名小程序功能的實(shí)例代碼
更新時(shí)間:2020年08月22日 14:11:12 作者:樹(shù)下影
這篇文章主要介紹了基于python tkinter的點(diǎn)名小程序,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
代碼如下所示:
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)建記錄
# 開(kāi)始點(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'] == "開(kāi)始":
break
def bt_start():
bt['command'] = bt_listen
bt['text'] = "開(kāi)始"
fg = ForGUI()
root.after(500, fg.start)
bt.update()
# 創(chuàng)建開(kāi)始按鈕
bt = tk.Button(f2, text='開(kāi)始點(diǎn)名嘍', stat="normal", command=bt_listen, bd=4, width=20, font=18)
bt.pack()
root.mainloop()
總結(jié)
到此這篇關(guān)于基于python tkinter的點(diǎn)名小程序功能的實(shí)例代碼的文章就介紹到這了,更多相關(guān)python tkinter點(diǎn)名小程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
- 基于Python實(shí)現(xiàn)簡(jiǎn)單的學(xué)生點(diǎn)名系統(tǒng)
- 基于Python編寫(xiě)一個(gè)點(diǎn)名器的示例代碼
- Python寫(xiě)一個(gè)簡(jiǎn)單上課點(diǎn)名系統(tǒng)(附源碼)
- python實(shí)戰(zhàn)練習(xí)做一個(gè)隨機(jī)點(diǎn)名的程序
- Python實(shí)現(xiàn)上課點(diǎn)名器系統(tǒng)
- 一起用Python做個(gè)上課點(diǎn)名器的制作過(guò)程
- python用tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)易能進(jìn)行隨機(jī)點(diǎn)名的界面
- python寫(xiě)一個(gè)隨機(jī)點(diǎn)名軟件的實(shí)例
- Python輕松寫(xiě)個(gè)課堂隨機(jī)點(diǎn)名系統(tǒng)
相關(guān)文章
Python實(shí)現(xiàn)在PyPI上發(fā)布自定義軟件包的方法詳解
在Python中我們經(jīng)常使用pip來(lái)安裝第三方Python軟件包,其實(shí)我們每個(gè)人都可以免費(fèi)地將自己寫(xiě)的Python包發(fā)布到PyPI上。本文我們就將詳細(xì)介紹如何發(fā)布測(cè)試包,需要的可以參考一下2022-06-06
Python 用NumPy創(chuàng)建二維數(shù)組的案例
這篇文章主要介紹了Python 用NumPy創(chuàng)建二維數(shù)組的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
淺談keras中的batch_dot,dot方法和TensorFlow的matmul
這篇文章主要介紹了淺談keras中的batch_dot,dot方法和TensorFlow的matmul,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
如何將yolo格式轉(zhuǎn)化為voc格式:txt轉(zhuǎn)xml(親測(cè)有效)
這篇文章主要介紹了如何將yolo格式轉(zhuǎn)化為voc格式:txt轉(zhuǎn)xml,親測(cè)有效,可以使用,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友參考下吧2023-12-12

