老师在上课的时候经常需要点名回答问题,但是遇到选择困难症,可以说非常尴尬。。。
因此,我开发了一款随机点名器,可以帮助点名:
首先我们展示一下效果,先在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是必须的哦~否则可能会出现乱码。。。