基于Python和Tkinter的霸王餐抽奖系统

实现效果

在这里插入图片描述

源码资源下载点击免费下载源码

介绍

这是一个基于Python和Tkinter的霸王餐抽奖系统。用户可以通过输入姓名和手机号参与抽奖,系统会自动为用户分配一个幸运码。当参与人数达到10人时,系统会自动开奖,并显示中奖者的信息。同时,系统还支持将参与者数据导出为CSV文件。

环境配置

  • Python 3.x
  • Tkinter(Python内置库)
  • Pandas(用于数据处理)
    确保已经安装了Python和以上库。

项目分布

  • save(): 保存参与者的数据
  • read(): 读取数据并开奖
  • export_data(): 导出参与者数据到CSV文件
  • 主窗口:用于输入数据和显示中奖信息

详细代码

import csv
import tkinter as tk
from tkinter import messagebox
import datetime
import pandas as pd
import os

# 获取当前时间
dt = datetime.datetime.now()
time = dt.strftime("%Y-%m-%d %H:%M:%S")

# 保存参与抽奖的数据
def save():
    try:
        name = txt_name.get().strip()
        tel = txt_tel.get().strip()

        if not name or not tel:
            messagebox.showwarning("警告", "姓名和手机号不能为空!")
            return

        if not tel.isdigit() or len(tel) != 11:
            messagebox.showwarning("警告", "请输入有效的11位手机号!")
            return

        flag = os.path.isfile('./data/bwc_data.csv')

        if flag:
            with open('./data/bwc_data.csv', 'r', newline='') as f:
                reader = csv.reader(f)
                next(reader)  # 跳过标题行
                myval = [int(row[3]) for row in reader]
                num1 = max(myval) + 1
        else:
            num1 = 1000001
            with open('./data/bwc_data.csv', 'w', newline='') as f:
                writer = csv.writer(f)
                writer.writerow(['姓名', '手机号', '参与抽奖时间', '幸运码'])

        with open('./data/bwc_data.csv', 'a+', newline='') as f:
            writer = csv.writer(f)
            writer.writerow([name, tel, time, num1])

        messagebox.showinfo("消息提示", f'您的幸运码是:{
      
      num1}')
    except Exception as e:
        messagebox.showerror("错误", f"发生错误: {
      
      e}")

# 读取数据,抽取幸运码
def read():
    try:
        aa = './data/bwc_data.csv'
        df = pd.read_csv(aa, encoding='gbk')
        count = df.shape[0]  # 参与人数

        if count < 10:
            messagebox.showwarning("警告", "参与人数不足10人,无法开奖!")
            return
        
        df1 = df.sort_values(by='幸运码', ascending=False).head(10)  # 取最后10条记录
        sum1 = sum(pd.to_datetime(df1['参与抽奖时间']).apply(lambda x: int(x.timestamp())))

        w_num_start = sum1 % count + 1000001  # 幸运码算法
        winners = []

        for i in range(3):
            w_num = w_num_start + i
            winner_info = df[df['幸运码'] == w_num]
            if not winner_info.empty:
                winner_info_str = f"{
      
      winner_info.iloc[0]['姓名']} ({
      
      winner_info.iloc[0]['手机号']}) - 幸运码: {
      
      w_num}"
                winners.append(winner_info_str)

        if winners:
            messagebox.showinfo("消息提示", '获奖者:\n' + '\n'.join(winners))
        else:
            messagebox.showinfo("消息提示", "未找到中奖者信息。")

    except FileNotFoundError:
        messagebox.showwarning("警告", "没有参与者数据文件,请先录入数据!")
    except Exception as e:
        messagebox.showerror("错误", f"发生错误: {
      
      e}")

# 导出参与者数据到csv文件
def export_data():
    try:
        aa = './data/bwc_data.csv'
        export_df = pd.read_csv(aa, encoding='gbk')
        export_filename = f'./data/exported_data_{
      
      datetime.datetime.now().strftime("%Y%m%d%H%M%S")}.csv'
        export_df.to_csv(export_filename, index=False, encoding='utf-8-sig')
        messagebox.showinfo("导出成功", f"参与者数据已成功导出到: {
      
      export_filename}")
    except FileNotFoundError:
        messagebox.showwarning("警告", "没有参与者数据文件,无法导出!")
    except Exception as e:
        messagebox.showerror("错误", f"导出数据时发生错误: {
      
      e}")

# 建立主窗口window
window = tk.Tk()
window.title('霸王餐抽奖')
window.geometry('600x430')

canvas = tk.Canvas(window, width=600, height=250)
image_file = tk.PhotoImage(file='./images/bg3.png')
image = canvas.create_image(0, 0, anchor='nw', image=image_file)
canvas.pack(side='top')

# 在主窗口添加标签
l1 = tk.Label(window, text='姓    名:', font=('Arial', 12)).place(x=30, y=270)
l2 = tk.Label(window, text='手机号:', font=('Arial', 12)).place(x=30, y=300)

# 在主窗口添加文本框
txt_name = tk.StringVar()
text1 = tk.Entry(window, textvariable=txt_name, show=None, width=45)
txt_tel = tk.StringVar()
text2 = tk.Entry(window, textvariable=txt_tel, show=None, width=45)
text1.place(x=100, y=270)
text2.place(x=100, y=300)

# 在主窗口添加命令按钮
button1 = tk.Button(window, width=10, height=3, text='点击参与', bg='tomato', command=save).place(x=430, y=260)
button2 = tk.Button(window, width=10, height=3, text='开奖', bg='orange', command=read).place(x=510, y=260)
button3 = tk.Button(window, width=20, height=2, text='导出参与者数据', bg='lightblue', command=export_data).place(x=230, y=350)

# 主窗口循环显示
window.mainloop()

总结

这个霸王餐抽奖系统使用了Python和Tkinter库来创建一个简单的图形用户界面,使用户能够通过输入姓名和手机号参与抽奖。系统会自动为每个参与者分配一个幸运码,并在达到10人时自动开奖。开奖算法基于参与时间和幸运码,选择最后10条记录中的前三个幸运码作为中奖者。此外,系统还支持将参与者数据导出为CSV文件,以便于记录和备份。
这个项目可以作为Python学习和Tkinter实践的一个很好的例子,展示了如何处理用户输入、如何使用Pandas库进行数据处理,以及如何将数据导出到文件中。通过这个项目,学习者可以了解到Python在开发小型应用程序时的灵活性和易用性。

猜你喜欢

转载自blog.csdn.net/weixin_49602952/article/details/139938375