python实现指针转盘

转盘选数字程序

可视化效果:
请添加图片描述
点击开始指针就会咔咔转,最后停在一个随机位置,代码直接能跑

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()
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值