【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文件夹下不同的转盘图。
作者:波小冰