实现效果
源码资源下载点击免费下载源码
介绍
这是一个基于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在开发小型应用程序时的灵活性和易用性。