首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python Tkinter 實作簡易抽獎系統:GUI 事件驅動與隨機選取完整範例

     編輯:更多程式設計知識

使用 Python 內建 tkinter 快速構建桌面抽獎程式,展示事件驅動程式設計、非阻塞定時器、檔案資料載入與遮罩顯示等實用技巧。

核心架構

  • App 類別封裝 UI 元件與邏輯
  • after(ms, callback) 實現非阻塞動畫迴圈
  • StringVar 雙向綁定輸入框顯示
  • 從 yaojiang.txt 讀取參加者名單(格式:姓名:電話)

完整程式碼(已修正語法與邏輯)


import tkinter as tk
import random

class LotteryApp:
    def __init__(self, root):
        self.root = root
        self.root.title("簡易抽獎系統")
        self.stop_flag = False
        self.participants = self.load_participants()

        # UI 佈局
        frame = tk.Frame(root)
        frame.pack(padx=10, pady=10)

        self.var = tk.StringVar(value="點擊開始")
        entry = tk.Entry(frame, textvariable=self.var, font=('微軟正黑體', 24), width=20, justify='center', bd=5)
        entry.pack(pady=10)

        btn_frame = tk.Frame(frame)
        btn_frame.pack()
        tk.Button(btn_frame, text='開始', fg='red', font=('微軟正黑體', 14), width=8, command=self.start).pack(side=tk.LEFT, padx=5)
        tk.Button(btn_frame, text='停止', fg='blue', font=('微軟正黑體', 14), width=8, command=self.stop).pack(side=tk.LEFT, padx=5)

    def load_participants(self):
        """讀取並遮罩電話號碼:前4後4顯示,中間4碼替換為 xxxx"""
        try:
            with open('yaojiang.txt', 'r', encoding='utf-8') as f:
                lines = [line.strip() for line in f if line.strip()]
        except FileNotFoundError:
            return ["(找不到名單檔案)"]
        
        result = []
        for line in lines:
            parts = line.split(':', 1)
            if len(parts) == 2:
                name, phone = parts
                if len(phone) >= 12:
                    masked = f"{phone[:4]}xxxx{phone[8:12]}"
                else:
                    masked = phone
                result.append(f"{name}:{masked}")
            else:
                result.append(line)
        return result

    def start(self):
        self.stop_flag = False
        self.animate()

    def stop(self):
        self.stop_flag = True

    def animate(self):
        if self.stop_flag:
            return
        winner = random.choice(self.participants)
        self.var.set(winner)
        # 每 50ms 更新一次,形成滾動效果
        self.root.after(50, self.animate)

if __name__ == '__main__':
    root = tk.Tk()
    app = LotteryApp(root)
    root.mainloop()

yaojiang.txt 範例格式


張三:0912345678
李四:0923456789
王五:0934567890

關鍵技術解析

技術點說明
root.after(ms, func)非阻塞定時器,回傳 ID 可用 after_cancel 取消。比 time.sleep 不會凍結 GUI。
StringVarTkinter 變數類別,綁定 Entry/Label 文字,修改變數自動更新 UI。
電話遮罩切片 phone[:4] + 'xxxx' + phone[8:12] 保護隱私。
隨機選取random.choice(list) 等機率抽取。

擴充建議

  • 加入「重置」按鈕、中獎紀錄顯示區(Listbox + Scrollbar)
  • 支援權重抽獎(random.choices(population, weights))
  • 改用 ttk 主題元件提升外觀
  • 打包為單一執行檔:pyinstaller --onefile --noconsole lottery.py

這個範例展示了 Tkinter 核心觀念,適合作為桌面小工具開發的起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved