commit b88c8c080230761e6a5abd7ce791f65c0ac1a83b Author: sairate Date: Sun Jun 22 14:07:36 2025 +0800 feat: 添加点名系统基础功能和大转盘点名功能 - 新增 base.py 文件实现基本点名功能 - 新增 plus.py 文件实现大转盘点名功能- 添加学生名单和转盘配置 - 实现随机点名和 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..359bb53 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/.idea/Roll_Call_System.iml b/.idea/Roll_Call_System.iml new file mode 100644 index 0000000..673bfd1 --- /dev/null +++ b/.idea/Roll_Call_System.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..36de856 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml new file mode 100644 index 0000000..ef4c87e --- /dev/null +++ b/.idea/material_theme_project_new.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..cb1d2fc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..bab31ba --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/READMD.md b/READMD.md new file mode 100644 index 0000000..58054a0 --- /dev/null +++ b/READMD.md @@ -0,0 +1,3 @@ +```bash +pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple +``` \ No newline at end of file diff --git a/base.py b/base.py new file mode 100644 index 0000000..efc48a0 --- /dev/null +++ b/base.py @@ -0,0 +1,44 @@ +# 导入所需要的库 +import tkinter +from tkinter import * +import random + +# 创建主窗口 +root = Tk() +root.geometry('500x150+300+500') +root.title('点名系统') + +bg_image = PhotoImage(file = '点名.png') + +bg_label = Label(root, image = bg_image) +bg_label.place(x=0, y=0, relwidth=1, relheight=1) + +# 设置全局变量 +var = StringVar() # 这个变量用来显示在标签上的名字 +names = ["李子傲","周洲","张庭嘉","董明轩"] + +# 这个列表存储学生的名字 +flag = False # 这个标志用来表示是否正在进行点名 + +# 定义一个函数,用来进行点名 +def roll(): + if flag: # 如果正在进行点名,那么显示一个随机的名字 + var.set(random.choice(names)) + root.after(10, roll) # 在10毫秒后,再次调用这个函数 + +# 定义一个函数,用来切换点名状态 +def check(): + global flag # 声明我们要使用的是全局变量,而不是创建一个新的局部变量 + if flag: + flag = False + else: # 否则,开始点名 + flag = True + roll() + + +# 创建并配置标签和按钮 +Label(root, textvariable=var, font=('楷体', 50)).pack() +Button(root, text="开始/停止点名", command=check).pack() + +# 启动事件循环 +root.mainloop() diff --git a/plus.py b/plus.py new file mode 100644 index 0000000..f7c9ec9 --- /dev/null +++ b/plus.py @@ -0,0 +1,186 @@ +import tkinter as tk +import random +import math +import time + + +class RouletteApp: + def __init__(self, root): + self.root = root + self.root.title("大转盘点名系统") + self.root.geometry("600x650") + + # 学生名单 + self.students = [ + "张三", "李四", "王五", "赵六" + + ] + + # 颜色列表 + self.colors = [ + "#FF9999", "#99FF99", "#9999FF", "#FF99FF" + ] + + # 创建画布 + self.canvas = tk.Canvas(root, width=500, height=500, bg="white") + self.canvas.pack(pady=20) + + # 创建按钮 + self.spin_button = tk.Button(root, text="开始旋转", command=self.start_spin, + font=("Arial", 14), bg="#4CAF50", fg="white") + self.spin_button.pack(pady=10) + + # 创建结果显示标签 + self.result_label = tk.Label(root, text="等待旋转...", + font=("Arial", 16, "bold"), fg="#333333") + self.result_label.pack(pady=10) + + # 绘制初始转盘 + self.draw_roulette() + + # 旋转状态变量 + self.is_spinning = False + self.spin_speed = 0 + self.selected_student = "" + + def draw_roulette(self): + """绘制转盘""" + self.canvas.delete("all") # 清除画布 + + # 计算每个扇区的角度 + angle_per_sector = 360 / len(self.students) + + # 绘制扇区 + for i in range(len(self.students)): + start_angle = i * angle_per_sector + self.canvas.create_arc( + 50, 50, 450, 450, + start=start_angle, + extent=angle_per_sector, + fill=self.colors[i % len(self.colors)], + outline="black" + ) + + # 添加学生姓名 + angle_rad = math.radians(start_angle + angle_per_sector / 2) + text_x = 250 + 150 * math.cos(angle_rad) + text_y = 250 + 150 * math.sin(angle_rad) + self.canvas.create_text( + text_x, text_y, + text=self.students[i], + font=("Arial", 10, "bold"), + angle=start_angle + angle_per_sector / 2 + ) + + # 绘制中心圆 + self.canvas.create_oval(240, 240, 260, 260, fill="#FFFFFF", outline="black") + + # 绘制指针 + self.canvas.create_line(250, 50, 250, 20, width=3, arrow=tk.LAST, fill="red") + self.canvas.create_polygon(240, 50, 260, 50, 250, 70, fill="red") + + def start_spin(self): + """开始旋转转盘""" + if not self.is_spinning: + self.is_spinning = True + self.spin_button.config(state=tk.DISABLED) + self.result_label.config(text="旋转中...") + self.spin_speed = random.uniform(30, 50) # 初始旋转速度 + self.spin_roulette() + + def spin_roulette(self): + """旋转转盘动画""" + if self.spin_speed > 0.1: + # 旋转转盘 + self.canvas.delete("all") + self.draw_rotated_roulette(self.spin_speed) + + # 更新旋转速度(减慢) + self.spin_speed *= 0.97 + + # 继续旋转 + self.root.after(30, self.spin_roulette) + else: + # 旋转结束 + self.is_spinning = False + self.spin_button.config(state=tk.NORMAL) + self.select_winner() + + def draw_rotated_roulette(self, rotation): + """绘制旋转后的转盘""" + # 计算每个扇区的角度 + angle_per_sector = 360 / len(self.students) + + # 绘制扇区 + for i in range(len(self.students)): + start_angle = i * angle_per_sector + rotation + self.canvas.create_arc( + 50, 50, 450, 450, + start=start_angle, + extent=angle_per_sector, + fill=self.colors[i % len(self.colors)], + outline="black" + ) + + # 添加学生姓名 + angle_rad = math.radians(start_angle + angle_per_sector / 2) + text_x = 250 + 150 * math.cos(angle_rad) + text_y = 250 + 150 * math.sin(angle_rad) + self.canvas.create_text( + text_x, text_y, + text=self.students[i], + font=("Arial", 10, "bold"), + angle=start_angle + angle_per_sector / 2 + ) + + # 绘制中心圆 + self.canvas.create_oval(240, 240, 260, 260, fill="#FFFFFF", outline="black") + + # 绘制指针 + self.canvas.create_line(250, 50, 250, 20, width=3, arrow=tk.LAST, fill="red") + self.canvas.create_polygon(240, 50, 260, 50, 250, 70, fill="red") + + def select_winner(self): + """随机选择一名学生并显示结果""" + self.selected_student = random.choice(self.students) + self.result_label.config(text=f"恭喜!被选中的是: {self.selected_student}", fg="#E91E63") + + # 高亮显示选中的学生 + self.highlight_winner() + + def highlight_winner(self): + """高亮显示被选中的学生""" + self.draw_roulette() # 先绘制正常转盘 + + # 找到选中学生的索引 + winner_idx = self.students.index(self.selected_student) + angle_per_sector = 360 / len(self.students) + + # 绘制高亮扇区 + start_angle = winner_idx * angle_per_sector + self.canvas.create_arc( + 50, 50, 450, 450, + start=start_angle, + extent=angle_per_sector, + fill="#FFEB3B", # 黄色高亮 + outline="black", + width=2 + ) + + # 重新添加学生姓名 + angle_rad = math.radians(start_angle + angle_per_sector / 2) + text_x = 250 + 150 * math.cos(angle_rad) + text_y = 250 + 150 * math.sin(angle_rad) + self.canvas.create_text( + text_x, text_y, + text=self.selected_student, + font=("Arial", 10, "bold"), + fill="red", # 红色文本 + angle=start_angle + angle_per_sector / 2 + ) + + +if __name__ == "__main__": + root = tk.Tk() + app = RouletteApp(root) + root.mainloop() \ No newline at end of file diff --git a/students.json b/students.json new file mode 100644 index 0000000..b43737a --- /dev/null +++ b/students.json @@ -0,0 +1,6 @@ +[ + "周洲", + "张庭嘉", + "李子傲", + "董明轩" +] diff --git a/点名.png b/点名.png new file mode 100644 index 0000000..78ee3ff Binary files /dev/null and b/点名.png differ