老师在上课的时候经常需要点名回答问题,但是遇到选择困难症,可以说非常尴尬。。。
因此,我开发了一款随机点名器,可以帮助点名:
首先我们展示一下效果,先在database.csv文件中存放一些人名信息:
将该csv文件存放到和py文件一个目录的文件夹里:
接下来展示效果:
随机点名器
可以看到,每次可以随机选取一个人的名字,而且不会重复哦~~~
那么这个软件是如何实现的呢?
全局变量:
MAINLIST=[]
YYY=None
界面代码:
class basedesk():#底板
def __init__(self, master):
global YYY
self.master = master
self.master.title("随机点名系统")
self.master.configure(bg='#B1FFF9')
self.master.geometry("1370x730")
YYY=mainwindow(self.master)
class mainwindow():#主界面
def __init__(self, master):
self.master = master
data_name = os.path.join(os.path.dirname(__file__), 'database.csv')
with open(data_name) as f:
f_csv=csv.reader(f)
self.data=[]
for row in f_csv:
self.data.append(row)
self.condition=0
self.i = 0
self.j=0
self.stop_check = False
self.master.name_label = tk.Label(self.master, text="姓名:", font=("Helvetic", 30, "bold"), relief="raised",cursor="heart").place(x=10,y=10)
self.master.picname_entry = tk.Entry(self.master,font=("Calibri",80),justify='center')
self.master.picname_entry.place(x=150, y=10, width=900, height=450)
self.master.picname_entry.insert(0,"准备点名")
self.master.submit_btn = tk.Button(self.master, text="开始", font=("Helvetic", 30, "bold"), bg='lightgreen',command=self.transformer)
self.master.submit_btn.place(x=50, y=600)
self.master.stop_btn = tk.Button(self.master, text="退出", font=("Helvetic", 30, "bold"), bg='red',command=self.stop)
self.master.stop_btn.place(x=200, y=600)
self.master.developername_label=tk.Label(self.master,text='',font=("Helvetic",20, "bold"),bg='#B1FFF9').place(x=900,y=600)
self.master.already_label=tk.Label(self.master,text='已点姓名:',font=("Helvetic",20, "bold"),bg='#B1FFF9').place(x=1100,y=10)
self.window3 = tk.Frame(self.master, bg='#63F034')
self.window3.place(x=1100, y=60, width=200, height=470)
self.window3.xscrollbar = Scrollbar(self.window3, orient=HORIZONTAL)
self.window3.yscrollbar = Scrollbar(self.window3)
self.window3.submitted_listbox = tk.Listbox(self.window3)
self.window3.xscrollbar.pack(side=BOTTOM, fill=X)
self.window3.yscrollbar.pack(side=RIGHT, fill=Y)
self.window3.submitted_listbox.place(x=0, y=0, width=182, height=452)
self.window3.xscrollbar.config(command=self.window3.submitted_listbox.xview)
self.window3.yscrollbar.config(command=self.window3.submitted_listbox.yview)
self.window3.submitted_listbox.config(xscrollcommand=self.window3.xscrollbar.set, yscrollcommand=self.window3.yscrollbar.set)
退出键功能逻辑:
def stop(self):
root.destroy()
选取姓名功能逻辑群
def different(self,):
self.master.picname_entry.delete(0, END)
self.master.picname_entry.insert(0, random.choice(self.data))
def factory1(self):
self.different()
self.i += 1
self.j += 1
if self.i == len(self.data):
self.i = 0
if self.stop_check==True :
self.factory2()
self.stop_check = False
else:
t = Timer(0.05, self.factory1)
t.start()
def factory2(self):
self.master.picname_entry.delete(0, END)
while True:
choosed=random.choice(self.data)
if choosed not in MAINLIST:
break
MAINLIST.append(choosed)
self.window3.submitted_listbox.delete(0,END)
for i in MAINLIST:
self.window3.submitted_listbox.insert(END,i)
self.master.picname_entry.insert(0, i)
self.master.stopper_btn.destroy()
self.master.submit_btn = tk.Button(self.master, text="开始", font=("Helvetic", 30, "bold"), bg='lightgreen', command=self.transformer)
self.master.submit_btn.place(x=50, y=600)
def stopper(self):
self.stop_check=True
def refresher(self):
self.window3.submitted_listbox.delete(0, END)
for i in MAINLIST:
self.window3.submitted_listbox.insert(END, self.data[i])
def transformer(self):
if len(self.data)==len(MAINLIST):
messagebox.showerror('错误', '已经点完啦~')
return
self.master.submit_btn.destroy()
self.master.stopper_btn = tk.Button(self.master, text="停止", font=("Helvetic", 30, "bold"), bg='yellow',command=self.stopper)
self.master.stopper_btn.place(x=50, y=600)
self.condition =1
self.j=0
self.factory1()
最后展示完整代码:
# encoding:gbk
from tkinter import *
from tkinter import messagebox
from mttkinter import mtTkinter as tk
import os,csv,random
from threading import Timer
MAINLIST=[]
YYY=None
class basedesk():#底板
def __init__(self, master):
global YYY
self.master = master
self.master.title("随机点名系统")
self.master.configure(bg='#B1FFF9')
self.master.geometry("1370x730")
YYY=mainwindow(self.master)
class mainwindow():#主界面
def __init__(self, master):
self.master = master
data_name = os.path.join(os.path.dirname(__file__), 'database.csv')
with open(data_name) as f:
f_csv=csv.reader(f)
self.data=[]
for row in f_csv:
self.data.append(row)
self.condition=0
self.i = 0
self.j=0
self.stop_check = False
self.master.name_label = tk.Label(self.master, text="姓名:", font=("Helvetic", 30, "bold"), relief="raised",cursor="heart").place(x=10,y=10)
self.master.picname_entry = tk.Entry(self.master,font=("Calibri",80),justify='center')
self.master.picname_entry.place(x=150, y=10, width=900, height=450)
self.master.picname_entry.insert(0,"准备点名")
self.master.submit_btn = tk.Button(self.master, text="开始", font=("Helvetic", 30, "bold"), bg='lightgreen',command=self.transformer)
self.master.submit_btn.place(x=50, y=600)
self.master.stop_btn = tk.Button(self.master, text="退出", font=("Helvetic", 30, "bold"), bg='red',command=self.stop)
self.master.stop_btn.place(x=200, y=600)
self.master.developername_label=tk.Label(self.master,text='',font=("Helvetic",20, "bold"),bg='#B1FFF9').place(x=900,y=600)
self.master.already_label=tk.Label(self.master,text='已点姓名:',font=("Helvetic",20, "bold"),bg='#B1FFF9').place(x=1100,y=10)
self.window3 = tk.Frame(self.master, bg='#63F034')
self.window3.place(x=1100, y=60, width=200, height=470)
self.window3.xscrollbar = Scrollbar(self.window3, orient=HORIZONTAL)
self.window3.yscrollbar = Scrollbar(self.window3)
self.window3.submitted_listbox = tk.Listbox(self.window3)
self.window3.xscrollbar.pack(side=BOTTOM, fill=X)
self.window3.yscrollbar.pack(side=RIGHT, fill=Y)
self.window3.submitted_listbox.place(x=0, y=0, width=182, height=452)
self.window3.xscrollbar.config(command=self.window3.submitted_listbox.xview)
self.window3.yscrollbar.config(command=self.window3.submitted_listbox.yview)
self.window3.submitted_listbox.config(xscrollcommand=self.window3.xscrollbar.set, yscrollcommand=self.window3.yscrollbar.set)
def stop(self):
root.destroy()
def different(self,):
self.master.picname_entry.delete(0, END)
self.master.picname_entry.insert(0, random.choice(self.data))
def factory1(self):
self.different()
self.i += 1
self.j += 1
if self.i == len(self.data):
self.i = 0
if self.stop_check==True :
self.factory2()
self.stop_check = False
else:
t = Timer(0.05, self.factory1)
t.start()
def factory2(self):
self.master.picname_entry.delete(0, END)
while True:
choosed=random.choice(self.data)
if choosed not in MAINLIST:
break
MAINLIST.append(choosed)
self.window3.submitted_listbox.delete(0,END)
for i in MAINLIST:
self.window3.submitted_listbox.insert(END,i)
self.master.picname_entry.insert(0, i)
self.master.stopper_btn.destroy()
self.master.submit_btn = tk.Button(self.master, text="开始", font=("Helvetic", 30, "bold"), bg='lightgreen', command=self.transformer)
self.master.submit_btn.place(x=50, y=600)
def stopper(self):
self.stop_check=True
def refresher(self):
self.window3.submitted_listbox.delete(0, END)
for i in MAINLIST:
self.window3.submitted_listbox.insert(END, self.data[i])
def transformer(self):
if len(self.data)==len(MAINLIST):
messagebox.showerror('错误', '已经点完啦~')
return
self.master.submit_btn.destroy()
self.master.stopper_btn = tk.Button(self.master, text="停止", font=("Helvetic", 30, "bold"), bg='yellow',command=self.stopper)
self.master.stopper_btn.place(x=50, y=600)
self.condition =1
self.j=0
self.factory1()
if __name__ == '__main__':#主函数
root = tk.Tk()
root.resizable(False, False)
basedesk(root)
root.mainloop()
值得注意的是,最上面的# encoding:gbk是必须的哦~否则可能会出现乱码。。。