python考勤管理系统 Python上课点名系统附源码( 二 )

',self.quit_window)if init_names:self.default_names=init_names#1.文件存在但是无内容 。2.文件不存在self.label_show_name_num.config(text=f"一共加载了{len(self.default_names)}个姓名")else:self.btn_start.config(state=DISABLED)self.label_show_name_num.config(text=f"请先手动导入人名单!")def place_widget(self):self.lf1.place(x=300,y=160,width=250,height=50)self.radioBtn_sequence.place(x=20,y=0)self.radioBtn_random.place(x=150,y=0)self.btn_start.place(x=300,y=220,width=100,height=30)self.btn_load_names.place(x=450,y=220,width=100,height=30)self._img.place(x=90, y=165, height=120, width=180)self.label_show_name_num.place(x=300,y=260)def label_show_name_adjust(self,the_name):if len (the_name)==1:self.label_show_name.place(x=280, y=10)elif len(the_name) == 2:self.label_show_name.place(x=180, y=10)elif len(the_name) == 3:self.label_show_name.place(x=120, y=10)elif len(the_name) == 4:self.label_show_name.place(x=80, y=10)else:self.label_show_name.place(x=0, y=10)def start_point_name(self):""" 启动之前进行判断,获取点名模式 :return: """if len(self.default_names)==1:messagebox.showinfo("提示",'人名单就一个人,不用选了!')self.label_show_name_var.set(self.default_names[0])self.label_show_name_adjust(self.default_names[0])returnif self.btn_start["text"]=="开始":self.btn_load_names.config(state=DISABLED)self.running_flag=Trueif isinstance(self.default_names,list):self.btn_start.config(text="就你了")if self.radioBtn_var.get()==1:mode="sequence"elif self.radioBtn_var.get()==2:mode="random"else:passself.thread_it(self.point_name_begin(mode))else:messagebox.showwarning("警告","请先导入人名单!")else:self.running_flag=Falseself.btn_load_names.config(state=NORMAL)self.btn_start.config(text="开始")def point_name_begin(self,mode):""" 开始点名,点名主函数 :param mode: :return: """if mode == "sequence":if self.running_flag:self.always_ergodic()elif mode=="random":while True:if self.running_flag:random_choice_name=random.choice(self.default_names)self.label_show_name_var.set(random_choice_name)self.label_show_name_adjust(random_choice_name)time.sleep(self.time_span)else:breakdef always_ergodic(self):""" 一直遍历此列表,使用死循环会造成线程阻塞 :return: """for i in self.default_names:if self.running_flag:self.label_show_name_var.set(i)self.label_show_name_adjust(i)time.sleep(self.time_span)if i==self.default_names[-1]:self.always_ergodic()else:breakdef load_names(self):""" 手动加载txt格式人名单 :return: """filename = askopenfilename(filetypes = [('文本文件', '.TXT'), ],title = "选择一个文本文件",initialdir="./")if filename:names=self.load_names_txt(filename)if names:self.default_names=namesno_Chinese_name_num=len([n for n in names if not self.load_name_check(n)])if no_Chinese_name_num==0:passelse:messagebox.showwarning("请注意",f'导入名单有{no_Chinese_name_num}个不是中文名字')self.label_show_name_num.config(text=f"一共加载了{len(self.default_names)}个姓名")default_name_ = "会是谁?"self.label_show_name_var.set(default_name_)self.label_show_name_adjust(default_name_)self.btn_start.config(state=NORMAL)else:messagebox.showwarning("警告","导入失败,请检查!")def load_names_txt(self,txt_file):""" 读取txt格式的人名单 :param txt_file: :return: """try:with open(txt_file,'r',encoding="utf-8")as f:names=[name.strip() for name in f.readlines()]if len(names)==0:return Falseelse:return namesexcept:return Falsedef load_name_check(self,name):""" 对txt文本中的人名进行校验 中文汉字->True 非中文汉字->False :param name: :return: """regex = r'[一-龥] 'if re.match(regex,name):return Trueelse:return Falsedef thread_it(self,func,*args):t=threading.Thread(target=func,args=args)t.setDaemon(True)t.start()def quit_window(self,*args):""" 程序退出触发此函数 :param args: :return: """ret=messagebox.askyesno('退出','确定要退出?')if ret:self.root.destroy()if __name__ == '__main__':a=APP()五.总结本次使用Tkinter开发了一款上课点名程序,此程序可以用于点名、抽奖…代码不到200行,程序简单又实用,主要有以下六个亮点:

推荐阅读