import tkinter as tk import random # 奖项 prize_list = [ ("好好听奖", 2), ("特等奖", 8), ("一等奖", 10), ("二等奖", 15), ("三等奖", 25), ("安慰奖", 40) ] prizes = [p[0] for p in prize_list] weights = [p[1] for p in prize_list] ITEM_HEIGHT = 40 VISIBLE_ROWS = 5 class SlotColumn: def __init__(self, master, width=120, font=("微软雅黑", 16)): self.canvas = tk.Canvas(master, width=width, height=ITEM_HEIGHT * VISIBLE_ROWS, bg="#fff", highlightthickness=1, highlightbackground="#ccc") self.canvas.pack(side=tk.LEFT, padx=10) self.font = font self.width = width self.center_y = (ITEM_HEIGHT * VISIBLE_ROWS) // 2 self.items = [random.choice(prizes) for _ in range(50)] self.draw_items() # 添加中奖框 self.canvas.create_rectangle( 2, self.center_y - ITEM_HEIGHT // 2, self.width - 2, self.center_y + ITEM_HEIGHT // 2, outline="#ff6600", width=3, dash=(5, 3) ) def draw_items(self): self.canvas.delete("item") for i, text in enumerate(self.items): y = i * ITEM_HEIGHT self.canvas.create_text(self.width // 2, y, text=text, font=self.font, fill="#d43f3a", tags="item") def shift(self): self.items.pop(0) self.items.append(random.choice(prizes)) self.draw_items() def stop_on_result(self, result_text): """强制将中奖项显示在中间,并停止滚动""" center_index = VISIBLE_ROWS // 2 + 1 self.items = [random.choice(prizes) for _ in range(center_index)] + [result_text] + [random.choice(prizes) for _ in range(20)] self.draw_items() def get_result(self): return self.items[VISIBLE_ROWS // 2 + 1] class SlotMachineApp: def __init__(self, root): self.root = root self.root.title("🎰 老虎机真实滚动") self.root.geometry("500x580") self.root.configure(bg="#ffffff") self.title = tk.Label(root, text="🎰 老虎机幸运抽奖 🎰", font=("微软雅黑", 20), bg="#ffffff", fg="#222") self.title.pack(pady=10) self.slot_frame = tk.Frame(root, bg="#ffffff") self.slot_frame.pack(pady=10) self.columns = [SlotColumn(self.slot_frame) for _ in range(3)] self.spin_button = tk.Button(root, text="🎯 开始抽奖", font=("微软雅黑", 16), bg="#28a745", fg="white", command=self.start_spin) self.spin_button.pack(pady=20) self.result_label = tk.Label(root, text="", font=("微软雅黑", 16), fg="#d9534f", bg="#ffffff") self.result_label.pack(pady=10) self.history = tk.Text(root, height=6, width=55, font=("微软雅黑", 10), state="disabled", bg="#f8f8f8") self.history.pack(padx=20, pady=10) self.running = False def start_spin(self): if self.running: return self.running = True self.result_label.config(text="") self.spin_button.config(state="disabled") self.final_result = random.choices(prizes, weights=weights, k=1)[0] self.delay_curves = [ self.generate_delay_curve(100), self.generate_delay_curve(130), self.generate_delay_curve(160) ] self.start_column(0) self.root.after(300, lambda: self.start_column(1)) self.root.after(600, lambda: self.start_column(2)) def generate_delay_curve(self, steps): delays = [] delay = 5 for i in range(steps): delays.append(delay) if delay < 30: delay += 1 elif delay < 80: delay += 2 else: delay += 5 return delays def start_column(self, index): def spin(): if self.delay_curves[index]: self.columns[index].shift() delay = self.delay_curves[index].pop(0) self.root.after(delay, spin) else: # 停止后对齐中奖项(只中间列) if index == 1: self.columns[1].stop_on_result(self.final_result) self.show_result() spin() def show_result(self): self.result_label.config(text=f"🎉 恭喜你抽中:{self.final_result} 🎉") self.history.config(state="normal") self.history.insert("end", f"🎯 抽中:{self.final_result}\n") self.history.see("end") self.history.config(state="disabled") self.spin_button.config(state="normal") self.running = False if __name__ == "__main__": root = tk.Tk() app = SlotMachineApp(root) root.mainloop()