|
|
@ -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()
|
|
|
|
|
|
|
|
|