feat: 添加点名系统基础功能和大转盘点名功能
- 新增 base.py 文件实现基本点名功能 - 新增 plus.py 文件实现大转盘点名功能- 添加学生名单和转盘配置 - 实现随机点名和
This commit is contained in:
commit
b88c8c0802
3
.idea/.gitignore
generated
vendored
Normal file
3
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# 默认忽略的文件
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
10
.idea/Roll_Call_System.iml
generated
Normal file
10
.idea/Roll_Call_System.iml
generated
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="jdk" jdkName="Python 3.10 (Roll_Call_System)" jdkType="Python SDK" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
15
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
15
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
|
<option name="ignoredPackages">
|
||||||
|
<value>
|
||||||
|
<list size="2">
|
||||||
|
<item index="0" class="java.lang.String" itemvalue="numpy" />
|
||||||
|
<item index="1" class="java.lang.String" itemvalue="pyzero" />
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
||||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
||||||
12
.idea/material_theme_project_new.xml
generated
Normal file
12
.idea/material_theme_project_new.xml
generated
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="MaterialThemeProjectNewConfig">
|
||||||
|
<option name="metadata">
|
||||||
|
<MTProjectMetadataState>
|
||||||
|
<option name="migrated" value="true" />
|
||||||
|
<option name="pristineConfig" value="false" />
|
||||||
|
<option name="userId" value="21c1c7ee:193388d497c:-7ff9" />
|
||||||
|
</MTProjectMetadataState>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
7
.idea/misc.xml
generated
Normal file
7
.idea/misc.xml
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Black">
|
||||||
|
<option name="sdkName" value="Python 3.10 (Roll_Call_System)" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (Roll_Call_System)" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
||||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/Roll_Call_System.iml" filepath="$PROJECT_DIR$/.idea/Roll_Call_System.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
3
READMD.md
Normal file
3
READMD.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
```bash
|
||||||
|
pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||||||
|
```
|
||||||
44
base.py
Normal file
44
base.py
Normal file
@ -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()
|
||||||
186
plus.py
Normal file
186
plus.py
Normal file
@ -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()
|
||||||
6
students.json
Normal file
6
students.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[
|
||||||
|
"周洲",
|
||||||
|
"张庭嘉",
|
||||||
|
"李子傲",
|
||||||
|
"董明轩"
|
||||||
|
]
|
||||||
Loading…
x
Reference in New Issue
Block a user