diff --git a/课堂随机点名系统源代码.py b/课堂随机点名系统源代码.py new file mode 100644 index 0000000..570591a --- /dev/null +++ b/课堂随机点名系统源代码.py @@ -0,0 +1,199 @@ +import tkinter as tk +from tkinter import messagebox +from tkinter import ttk +import os +import random +import time + + +class MinimizeApp: + def __init__(self, master): + self.current_names = None + self.ordering = None + self.engine = None + self.original_geometry = None + self.master = master + self.master.title("课堂随机点名系统") + self.minimized = False # 标记是否已最小化 + self.master.protocol("WM_DELETE_WINDOW", self.display_messagebox) + # 弹窗提示确认退出 + self.master.attributes('-topmost', True) + # 定义学生列表 + self.names = [] + # 读取文件中的名字 + self.load_names() + + # 播放名字的控件 + self.label_name = tk.Label(self.master, text="谁会是那个幸运儿呢?", font=("Times New Roman", 50), fg="red") + self.label_name.pack(pady=50) + + # 设置frame 居中显示 + button_frame = tk.Frame(self.master) + button_frame.pack() + items = ("加分", "减分", "旷课", "迟到", "请假") + self.combo = ttk.Combobox(button_frame, values=items, font=("宋体", 15), width=5) + self.combo.set("加分") + # 设置默认值 + self.combo.configure(font=("宋体", 15)) + # 设置字体大小写 + self.scale = tk.Scale(self.master, from_=0, to=200, orient='horizontal', command=self.resize) + self.scale.set(100) + # 初始页面大小 + self.scale.pack(expand=True, fill=tk.BOTH, side=tk.BOTTOM) + + # 设置退出按钮 + self.button_quit = tk.Button(button_frame, text="退出", font=("宋体", 15), width=9, + command=self.display_messagebox) + self.button_quit.pack(side=tk.LEFT, anchor="center", padx=22) + # 设置标记内容 + self.combo.pack(side=tk.LEFT, fill=tk.BOTH, padx=5) + + # 创建一个IntVar对象来存储复选框的状态 + self.check_var = tk.IntVar(value=0) + # 默认值设置为0(未选中) + + # 标记按钮 + self.button_mark = tk.Button(button_frame, text="标记", font=("宋体", 15), width=9, command=self.write_txt) + self.button_mark.pack(side=tk.LEFT, anchor="center", padx=20) + + # 随机开始按钮 + self.button_action = tk.Button(button_frame, text="随机开始", font=("宋体", 15), width=9, + command=self.toggle_rolling) + self.button_action.pack(side=tk.LEFT, anchor="center", padx=20) + + # 顺序开始按钮 + self.sequence_btn = tk.Button(button_frame, text="顺序开始", font=("宋体", 15), width=9, + command=self.toggle_ordering) + self.sequence_btn.pack(side=tk.LEFT, anchor="center", padx=20) + + # 最小化按钮 + self.button_min = tk.Button(button_frame, text="最小化", font=("宋体", 15), width=9, command=self.toggle) + self.button_min.pack(side=tk.LEFT, anchor="center", padx=20) + + # 配置最小化时显示的小窗口 + self.mini_window = tk.Toplevel(self.master) + self.mini_window.geometry("100x50+{}+0".format(self.master.winfo_screenwidth() - 100)) + self.mini_window.overrideredirect(True) + # 去除窗口边框 + self.mini_window.withdraw() + # 初始时隐藏 + + # 最大化按钮 + self.maximize_btn = tk.Button(self.mini_window, text="最大化", font=("宋体", 20, "bold"), command=self.toggle) + self.maximize_btn.pack(fill=tk.BOTH, expand=True) + + # 控制变量 + self.rolling = False + self.current_name = "" + + def resize(self, ev=None): + # 监控窗口是不是最大化,最大化则字体变大,否则为55号字 + if self.master.state() == 'zoomed': + self.label_name.config(font='宋体 -%d bold' % self.scale.get()) + elif not self.master.state() == 'zoomed': # self.root.state() == 'iconic': + self.label_name.config(font='宋体 -%d bold' % self.scale.get()) + + def toggle(self): + if self.minimized: + # 如果当前是最小化,恢复窗口 + self.master.deiconify() + # 显示主窗口 + # self.master.geometry("880x300") + # 初始大小 + # self.master.geometry(self.original_geometry) + # 恢复原始大小 + self.mini_window.withdraw() + # 隐藏最小化窗口 + self.button_min.config(text="最小化") + self.minimized = False + else: + # 如果当前是正常大小,最小化窗口 + self.original_geometry = self.master.geometry() + # 存储当前大小和位置 + self.master.withdraw() + # 隐藏主窗口 + self.mini_window.deiconify() + # 显示最小化窗口 + self.mini_window.attributes('-topmost', 1) + self.minimized = True + + def load_names(self): + """从当前目录下的names.txt文件中读取名字""" + if os.path.exists("names.txt"): + with open("names.txt", "r", encoding="utf-8") as f: + for name in f: + name = name.strip() + if name: + self.names.append(name) + else: + messagebox.showerror("错误", "找不到names.txt,已自动创立新的names.txt,请将人名输入新的names.text!") + with open("names.txt", "w+", encoding="utf-8") as fi: + fi.write("") + + def write_txt(self): + label_text = self.label_name.cget("text") + with open("标记内容.txt", 'a+', encoding='utf-8') as f: + f.write(label_text + f" {self.combo.get()}\n") + + def toggle_rolling(self): + """切换播放状态,并更新按钮文字""" + self.rolling = not self.rolling + if self.rolling: + self.button_action.config(text="随机暂停") + self.roll_name() + if self.check_var.get() == 1: + self.engine.say(self.current_name) + self.engine.runAndWait() + else: + self.button_action.config(text="随机开始") + + def toggle_ordering(self): + """切换播放状态,并更新按钮文字""" + self.ordering = not self.ordering + if self.ordering: + self.sequence_btn.config(text="顺序暂停") + self.sequential_name() + if self.check_var.get() == 1: + self.engine.say(self.current_name) + self.engine.runAndWait() + else: + self.sequence_btn.config(text="顺序开始") + + def roll_name(self): + """随机选取一个名字播放""" + + if self.names: + self.current_name = random.choice(self.names) + self.label_name.config(text=self.current_name) + self.master.update() + time.sleep(0.03) + if self.rolling: + self.roll_name() + + def sequential_name(self): + """顺序选取一个名字播放""" + + if self.names: + le = len(self.names) + for current_name in range(le): # 遍历次数 + for a in range(current_name + 1, le): # 查找待排序序列中的最小元素并交换 + if self.names[current_name] > self.names[a]: + self.names[current_name], self.names[a] = self.names[a], self.names[current_name] + print(self.names) + # self.label_name.config(text=self.names) + self.master.update() + time.sleep(1) + if self.ordering: + self.sequential_name() + + def display_messagebox(self): + """弹窗提示是否确认退出程序""" + if messagebox.askokcancel("退出程序", "确定要退出程序吗?"): + self.master.destroy() + + +if __name__ == "__main__": + root = tk.Tk() + app = MinimizeApp(root) + root.mainloop() +