转盘选数字程序
可视化效果:
点击开始指针就会咔咔转,最后停在一个随机位置,代码直接能跑
import tkinter as tk
from tkinter import messagebox
import random
import math
import time
# 定义数字对应的颜色和概率
colors = {
0: "pink",
50: "blue",
10: "green",
100: "orange",
200: "purple",
300: "Brown",
500: "red"
}
probabilities = {
0: 0.1,
50: 0.15,
10: 0.2,
100: 0.2,
200: 0.15,
300: 0.1,
500: 0.1
}
# 初始化转盘指针位置
pointer_position = 0
# 创建主窗口
window = tk.Tk()
window.title("转盘")
window.geometry("400x400")
# 创建画布
canvas = tk.Canvas(window, width=300, height=300)
canvas.pack()
# 绘制转盘
# 绘制转盘
def draw_wheel():
start_angle = 0
for number, color in colors.items():
arc_angle = int(360 * probabilities[number])
canvas.create_arc(50, 50, 250, 250, start=start_angle, extent=arc_angle, fill=color)
# 添加数字标签
text_angle = start_angle + arc_angle/2
text_x = 150 + 80 * math.cos(-math.radians(text_angle))
text_y = 150 + 80 * math.sin(-math.radians(text_angle))
canvas.create_text(text_x, text_y, text=str(number), fill="white", font=("Arial", 16, "bold"))
start_angle += arc_angle
# 绘制指针
draw_pointer()
# 绘制指针
def draw_pointer():
global pointer_position
canvas.delete("pointer")# 删除原有指针
start_angle = pointer_position
canvas.create_line(150, 150, 150 + 100 * (math.cos(-math.radians(start_angle))), 150 + 100 * (math.sin(-math.radians(start_angle))), width=4, arrow="last", fill="black", tag="pointer")
# 点击开始按钮时触发的事件
def start_spin():
global pointer_position
spin()
# 指针转动
# 如果随机数小于累计概率,则中奖
# 中奖后指针rotate_wheel停止转动
def rotate_wheel(aim_position):
global pointer_position
pointer_position += 10
if pointer_position < aim_position:
canvas.delete("pointer") # 清除之前的指针
draw_pointer()
canvas.after(10, rotate_wheel, aim_position) # 修正此处
else:
pointer_position = pointer_position % 360
draw_pointer()
# 模拟转动转盘
def spin():
global pointer_position
# 生成随机数
# 根据时间生成随机数种子
random.seed(time.time())
random_number = random.uniform(0, 1)
sele_num = 0
cumulative_probability = 0
#计算random_number对应probabilities的数字
for number, probability in probabilities.items():
cumulative_probability += probability
if random_number <= cumulative_probability:
sele_num = number
break
#指针转动到对应数字的位置
aim_position = pointer_position + 360 * random_number - pointer_position +360
rotate_wheel(aim_position)
# 判断是否中奖
# 如果随机数小于累计概率,则中奖
# 中奖后指针rotate_wheel停止转动
# messagebox.showinfo("结果", f"您中奖了!\n获得了 {sele_num} 分")
pointer_position = pointer_position % 360
return
# 绘制转盘和按钮
draw_wheel()
start_button = tk.Button(window, text="开始", command=start_spin)
start_button.pack()
window.mainloop()