【python-自定义抽奖大转盘】

1、抽奖转盘自定义,可PS,亦可用Excel的饼图,简单使用。

2、如果同时有多种奖项,放在image文件夹下可自动加载,手动选择即可。

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import os
import random
import time

class ImageRoulette:
    def __init__(self):
        self.root = tk.Tk()
        self.root.configure(bg='white')
        self.root.title("自定义抽奖转盘")

        style = ttk.Style()

        # 定义按钮样式
        style.configure('TButton', font=("微软雅黑", 18), background='lightblue', foreground='black')

        # 定义下拉框样式
        style.configure('TMenubutton', font=("微软雅黑", 18), background='lightblue', foreground='black')

        # 创建一个字体对象
        font_1 = ("微软雅黑", 16)

        # 创建一个框架来放置"奖励选择"和下拉框
        frame = tk.Frame(self.root)
        frame.pack()

        # 添加"奖励选择"文本
        label = tk.Label(frame, text="奖励选择:", bg='white',font=font_1)
        label.pack(side=tk.LEFT)

        # 获取 image 文件夹下的图片文件列表
        self.image_folder = "image"
        self.image_files = [f for f in os.listdir(self.image_folder) if f.endswith(('.jpg', '.png', '.jpeg'))]

        # 创建下拉选择框
        self.selected_image_var = tk.StringVar()
        self.selected_image_var.set(self.image_files[0])
        self.dropdown = tk.OptionMenu(frame, self.selected_image_var, *self.image_files)
        self.dropdown.pack(side=tk.LEFT)

        # 显示图片的标签
        self.image_label = tk.Label(self.root, bg='white')
        self.image_label.pack()



        # 绘制指针
        self.pointer = tk.Canvas(self.root, width=50, height=25, bg='white', highlightthickness=0)
        self.pointer.create_line(25, 25, 25, 0, width=4, arrow='last',fill='red')
        self.pointer.pack()

        # 创建一个框架来放置"奖励选择"和下拉框
        frame2 = tk.Frame(self.root)
        frame2.pack()

        # 抽奖按钮
        self.spin_button = tk.Button(frame2, text="开始抽奖", command=self.rotate_image,font=font_1)
        self.spin_button.pack(side=tk.LEFT)

        self.curr_image = self.image_files[0]
        # 加载初始图片
        self.load_image(self.curr_image)

        # 当下拉框选项改变时的事件处理
        self.selected_image_var.trace('w', self.on_image_change)

        # self.pointer2 = tk.Canvas(self.image_label, width=500, height=500)
        # self.pointer2.create_line(25, 25, 25, 5, width=2, arrow='last')
        # self.pointer2.pack()

    def load_image(self, image_file):
        image_path = os.path.join(self.image_folder, image_file)
        self.image = Image.open(image_path)
        tk_image = ImageTk.PhotoImage(self.image)
        self.image_label.config(image=tk_image)
        self.image_label.image = tk_image

    def rotate_image(self):
        total = random.randint(1600,1965)
        step = 10
        for angle in range(0, total, step):  # 以 10 度为步长从 0 旋转到 360 度
            print('距离结束{}'.format(total-angle))
            if angle>1600:
                # step = step - random.randint(1,3)
                time.sleep(0.25)
            # elif angle>1300:
            #     # step = step - random.randint(1,3)
            #     time.sleep(0.25)
            elif angle>1300:
                # step = step - random.randint(1,3)
                time.sleep(0.1)
            else:
                time.sleep(0.03)
            rotated_image = self.image.rotate(angle)
            tk_image = ImageTk.PhotoImage(rotated_image)
            self.image_label.config(image=tk_image)
            self.image_label.image = tk_image
            self.root.update()
            print(step)

            # sleep(0.1)  # 稍微延迟一下,控制旋转速度

    def start_spin(self):
        # 随机转动时间 5 - 10 秒
        spin_time = random.randint(5, 10)
        start_time = time.time()
        delay = 0.05  # 初始延迟时间
        while time.time() - start_time < spin_time:
            random_image = random.choice(self.image_files)
            self.load_image(random_image)
            self.root.update()
            # 延迟时间逐渐增加,实现减速效果
            time.sleep(delay)
            delay += 0.01
        # 停止后显示随机图片
        final_image = random.choice(self.image_files)
        # self.load_image(final_image)

    def on_image_change(self, *args):
        self.curr_image  = self.selected_image_var.get()
        self.load_image(self.curr_image)

    def run(self):
        self.root.mainloop()

if __name__ == '__main__':
    app = ImageRoulette()
    app.run()

3、如下为不同image文件夹下不同的转盘图。

作者:波小冰

物联沃分享整理
物联沃-IOTWORD物联网 » 【python-自定义抽奖大转盘】

发表回复