ADD file via upload

main
pmlkihbsy 1 year ago
parent b475f0f621
commit 861201e69a

@ -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()
Loading…
Cancel
Save