工作需要用Python加ai写了一个积分抽奖程序

2025-03-05 74 0

我的工作是一名培训机构的老师,在面对学生上课的情况,根据学生的表现来奖励对应的积分。同时提高了和学生的互动性,打包好的成品软件在文章底部即可下载(温馨提示:要把电脑的杀毒关闭,它会误报!!!),或者各位需要把代码拿去修改直接将源码修改一下即可:

软件演示:

成品代码:

import tkinter as tk
from tkinter import ttk, messagebox
import random

# 抽奖数据
participants = []
prizes = [50, 40, 30, 20, 10, 5]
prize_distribution = [0.05, 0.10, 0.15, 0.20, 0.30, 0.20]  # 对应每个奖品的概率

# 抽奖函数
def draw_prize():
    # 选择一个名字
    name = name_var.get()
    if not name:
        messagebox.showwarning("警告", "请选择一个学生姓名")
        return

    # 滚动效果模拟
    for _ in range(10):  # 模拟滚动10次
        prize = random.choices(prizes, prize_distribution)[0]
        prize_label.config(text=f"正在滚动...{prize}")
        root.update()
        root.after(100)  # 延迟0.1秒

    # 最终结果
    final_prize = random.choices(prizes, prize_distribution)[0]
    prize_label.config(text=f"{name} 抽到的酷币数量为:{final_prize}")


def add_participant():
    name = name_entry.get()
    if name:
        participants.append(name)

        name_dropdown['values'] = participants
        name_entry.delete(0, tk.END)
        messagebox.showinfo("成功", f"{name} 已成功添加")
        # 在添加学生姓名后,自动选择该学生
        name_var.set(name)
    else:
        messagebox.showwarning("警告", "请输入学生姓名")


def update_prizes():
    try:
        new_prizes = [int(entry.get()) for entry in prize_entries]
        new_distribution = [float(entry.get()) for entry in distribution_entries]

        if len(new_prizes) != len(new_distribution):
            raise ValueError("奖品数量和概率数量不匹配")

        if not all(0 < dist < 1 for dist in new_distribution):
            raise ValueError("概率必须在0和1之间")

        if not sum(new_distribution) == 1:
            raise ValueError("概率之和必须等于1")

        global prizes, prize_distribution
        prizes = new_prizes
        prize_distribution = new_distribution

        messagebox.showinfo("成功", "奖品和概率已更新")
    except ValueError as e:
        messagebox.showerror("错误", str(e))


def clear_participants():
    global participants
    participants = []
    name_dropdown['values'] = participants
    name_var.set("")
    messagebox.showinfo("成功", "学生数据已清空")

# 创建主窗口
root = tk.Tk()
root.title("酷币抽奖程序")
root.geometry("600x400")  # 设置窗口大小

# 创建自适应布局
root.grid_rowconfigure((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), weight=1)
root.grid_columnconfigure((0, 1, 2), weight=1)

# 创建姓名输入框和添加按钮
name_frame = ttk.Frame(root)
name_frame.grid(row=0, column=0, columnspan=3, padx=20, pady=10)

name_entry = tk.Entry(name_frame, width=30)
name_entry.pack(side=tk.LEFT, padx=5, pady=5)

add_button = tk.Button(name_frame, text="添加学生姓名", command=add_participant, width=30, height=2)
add_button.pack(side=tk.RIGHT, padx=5, pady=5)

# 创建姓名下拉框
name_var = tk.StringVar()
name_dropdown = ttk.Combobox(root, width=30, textvariable=name_var, height=5)  # 设置下拉框的列表高度为5
name_dropdown['values'] = participants
name_dropdown['state'] = 'readonly'
name_dropdown.grid(row=1, column=0, columnspan=3, padx=20, pady=10)

# 创建抽奖按钮
draw_button = tk.Button(root, text="抽奖", command=draw_prize, width=30, height=2)
draw_button.grid(row=2, column=1, padx=20, pady=10)

# 创建奖品显示标签
prize_label = tk.Label(root, text="", font=("Helvetica", 16))
prize_label.grid(row=3, column=0, columnspan=3, padx=20, pady=10)

# 创建奖品和概率输入框
prize_distribution_frame = ttk.Frame(root)
prize_distribution_frame.grid(row=4, column=0, columnspan=3, padx=20, pady=10)

prize_entries = []
distribution_entries = []

tk.Label(prize_distribution_frame, text="奖品数量", font=("Helvetica", 12)).grid(row=0, column=0, padx=10, pady=5)
tk.Label(prize_distribution_frame, text="抽奖概率", font=("Helvetica", 12)).grid(row=0, column=1, padx=10, pady=5)

for i, (prize, dist) in enumerate(zip(prizes, prize_distribution)):
    prize_entry = tk.Entry(prize_distribution_frame, width=10)
    prize_entry.insert(0, prize)
    prize_entry.grid(row=i + 1, column=0, padx=10, pady=2)
    prize_entries.append(prize_entry)

    distribution_entry = tk.Entry(prize_distribution_frame, width=10)
    distribution_entry.insert(0, f"{dist:.2f}")
    distribution_entry.grid(row=i + 1, column=1, padx=10, pady=2)
    distribution_entries.append(distribution_entry)

# 创建更新奖品和概率按钮
update_button = tk.Button(prize_distribution_frame, text="更新奖品和概率", command=update_prizes, width=30, height=2)
update_button.grid(row=len(prizes) + 1, column=0, columnspan=2, pady=20)

# 创建清空学生数据按钮
clear_button = tk.Button(prize_distribution_frame, text="清空学生数据", command=clear_participants, width=30, height=2)
clear_button.grid(row=len(prizes) + 2, column=0, columnspan=2, pady=10)

# 运行主循环
root.mainloop()

注释程序:

import tkinter as tk  # 导入tkinter库,用于创建图形用户界面
from tkinter import ttk, messagebox  # 导入ttk模块进行高级控件的使用,导入messagebox用于显示消息对话框
import random  # 导入random库,用于生成随机数

# 抽奖数据
participants = []  # 存储参与抽奖的学生姓名列表
prizes = [50, 40, 30, 20, 10, 5]  # 存储奖品数量的列表
prize_distribution = [0.05, 0.10, 0.15, 0.20, 0.30, 0.20]  # 对应每个奖品的概率列表

# 抽奖函数
def draw_prize():
    # 选择一个名字
    name = name_var.get()  # 获取姓名下拉框中选择的值
    if not name:  # 如果没有选择名字
        messagebox.showwarning("警告", "请选择一个学生姓名")  # 弹出警告框提示用户选择学生姓名
        return  # 结束函数

    # 滚动效果模拟
    for _ in range(10):  # 模拟滚动10次
        prize = random.choices(prizes, prize_distribution)[0]  # 根据概率随机选择一个奖品
        prize_label.config(text=f"正在滚动...{prize}")  # 更新奖品显示标签的文本
        root.update()  # 更新主窗口
        root.after(100)  # 延迟0.1秒

    # 最终结果
    final_prize = random.choices(prizes, prize_distribution)[0]  # 再次根据概率随机选择一个最终奖品
    prize_label.config(text=f"{name} 抽到的酷币数量为:{final_prize}")  # 更新奖品显示标签的文本为最终结果

def add_participant():
    name = name_entry.get()  # 获取姓名输入框中的值
    if name:  # 如果输入框中有内容
        participants.append(name)  # 将姓名添加到参与抽奖的学生姓名列表中

        name_dropdown['values'] = participants  # 更新姓名下拉框中的选项为最新的学生姓名列表
        name_entry.delete(0, tk.END)  # 清空姓名输入框
        messagebox.showinfo("成功", f"{name} 已成功添加")  # 弹出成功提示框
        # 在添加学生姓名后,自动选择该学生
        name_var.set(name)  # 设置姓名下拉框的默认选择为最新添加的学生
    else:
        messagebox.showwarning("警告", "请输入学生姓名")  # 如果输入框为空,弹出警告框提示用户输入学生姓名

def update_prizes():
    try:
        new_prizes = [int(entry.get()) for entry in prize_entries]  # 获取所有奖品数量输入框中的值并转换为整数列表
        new_distribution = [float(entry.get()) for entry in distribution_entries]  # 获取所有抽奖概率输入框中的值并转换为浮点数列表

        if len(new_prizes) != len(new_distribution):  # 如果奖品数量和概率数量不匹配
            raise ValueError("奖品数量和概率数量不匹配")  # 抛出ValueError异常

        if not all(0 < dist < 1 for dist in new_distribution):  # 如果概率不在0到1之间
            raise ValueError("概率必须在0和1之间")  # 抛出ValueError异常

        if not sum(new_distribution) == 1:  # 如果概率之和不等于1
            raise ValueError("概率之和必须等于1")  # 抛出ValueError异常

        global prizes, prize_distribution  # 声明使用全局变量prizes和prize_distribution
        prizes = new_prizes  # 更新全局变量prizes为新的奖品数量列表
        prize_distribution = new_distribution  # 更新全局变量prize_distribution为新的抽奖概率列表

        messagebox.showinfo("成功", "奖品和概率已更新")  # 弹出成功提示框
    except ValueError as e:  # 捕获ValueError异常
        messagebox.showerror("错误", str(e))  # 弹出错误提示框,显示异常信息

def clear_participants():
    global participants  # 声明使用全局变量participants
    participants = []  # 清空参与抽奖的学生姓名列表
    name_dropdown['values'] = participants  # 更新姓名下拉框中的选项为空
    name_var.set("")  # 清空姓名下拉框的默认选择
    messagebox.showinfo("成功", "学生数据已清空")  # 弹出成功提示框

# 创建主窗口
root = tk.Tk()  # 创建一个主窗口实例
root.title("酷币抽奖程序")  # 设置主窗口的标题
root.geometry("600x400")  # 设置主窗口的大小为600x400像素

# 创建自适应布局
root.grid_rowconfigure((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), weight=1)  # 配置所有行具有相同的权重,以便自适应布局
root.grid_columnconfigure((0, 1, 2), weight=1)  # 配置所有列具有相同的权重,以便自适应布局

# 创建姓名输入框和添加按钮
name_frame = ttk.Frame(root)  # 创建一个Frame容器,用于放置姓名输入框和添加按钮
name_frame.grid(row=0, column=0, columnspan=3, padx=20, pady=10)  # 将Frame放置在网格布局的第0行,跨3列,并设置外边距

name_entry = tk.Entry(name_frame, width=30)  # 创建一个宽度为30的Entry输入框,用于输入学生姓名
name_entry.pack(side=tk.LEFT, padx=5, pady=5)  # 将Entry输入框放置在Frame的左侧,并设置内边距

add_button = tk.Button(name_frame, text="添加学生姓名", command=add_participant, width=30, height=2)  # 创建一个按钮,文本为“添加学生姓名”,点击时调用add_participant函数,宽度30,高度2
add_button.pack(side=tk.RIGHT, padx=5, pady=5)  # 将按钮放置在Frame的右侧,并设置内边距

# 创建姓名下拉框
name_var = tk.StringVar()  # 创建一个StringVar对象,用于存储姓名下拉框的值
name_dropdown = ttk.Combobox(root, width=30, textvariable=name_var, height=5)  # 创建一个下拉框,宽度30,绑定到name_var,下拉列表高度为5
name_dropdown['values'] = participants  # 设置下拉框的初始选项为空
name_dropdown['state'] = 'readonly'  # 设置下拉框为只读状态,用户只能选择不能编辑
name_dropdown.grid(row=1, column=0, columnspan=3, padx=20, pady=10)  # 将下拉框放置在网格布局的第1行,跨3列,并设置外边距

# 创建抽奖按钮
draw_button = tk.Button(root, text="抽奖", command=draw_prize, width=30, height=2)  # 创建一个按钮,文本为“抽奖”,点击时调用draw_prize函数,宽度30,高度2
draw_button.grid(row=2, column=1, padx=20, pady=10)  # 将按钮放置在网格布局的第2行,第1列,并设置外边距

# 创建奖品显示标签
prize_label = tk.Label(root, text="", font=("Helvetica", 16))  # 创建一个标签,初始文本为空,字体为Helvetica,大小为16
prize_label.grid(row=3, column=0, columnspan=3, padx=20, pady=10)  # 将标签放置在网格布局的第3行,跨3列,并设置外边距

# 创建奖品和概率输入框
prize_distribution_frame = ttk.Frame(root)  # 创建一个Frame容器,用于放置奖品和概率输入框
prize_distribution_frame.grid(row=4, column=0, columnspan=3, padx=20, pady=10)  # 将Frame放置在网格布局的第4行,跨3列,并设置外边距

prize_entries = []  # 创建一个列表,用于存储奖品数量输入框的实例
distribution_entries = []  # 创建一个列表,用于存储抽奖概率输入框的实例

tk.Label(prize_distribution_frame, text="奖品数量", font=("Helvetica", 12)).grid(row=0, column=0, padx=10, pady=5)  # 创建一个标签,文本为“奖品数量”,字体为Helvetica,大小为12,并将其放置在网格布局的第0行第0列
tk.Label(prize_distribution_frame, text="抽奖概率", font=("Helvetica", 12)).grid(row=0, column=1, padx=10, pady=5)  # 创建一个标签,文本为“抽奖概率”,字体为Helvetica,大小为12,并将其放置在网格布局的第0行第1列

for i, (prize, dist) in enumerate(zip(prizes, prize_distribution)):  # 遍历prizes和prize_distribution中的元素,并获取索引和值
    prize_entry = tk.Entry(prize_distribution_frame, width=10)  # 创建一个宽度为10的Entry输入框,用于输入奖品数量
    prize_entry.insert(0, prize)  # 在输入框中插入当前奖品的数量
    prize_entry.grid(row=i + 1, column=0, padx=10, pady=2)  # 将输入框放置在网格布局的第i+1行第0列,并设置外边距
    prize_entries.append(prize_entry)  # 将输入框实例添加到prize_entries列表中

    distribution_entry = tk.Entry(prize_distribution_frame, width=10)  # 创建一个宽度为10的Entry输入框,用于输入抽奖概率
    distribution_entry.insert(0, f"{dist:.2f}")  # 在输入框中插入当前抽奖的概率,保留两位小数
    distribution_entry.grid(row=i + 1, column=1, padx=10, pady=2)  # 将输入框放置在网格布局的第i+1行第1列,并设置外边距
    distribution_entries.append(distribution_entry)  # 将输入框实例添加到distribution_entries列表中

# 创建更新奖品和概率按钮
update_button = tk.Button(prize_distribution_frame, text="更新奖品和概率", command=update_prizes, width=30, height=2)  # 创建一个按钮,文本为“更新奖品和概率”,点击时调用update_prizes函数,宽度30,高度2
update_button.grid(row=len(prizes) + 1, column=0, columnspan=2, pady=20)  # 将按钮放置在网格布局的第len(prizes)+1行,跨2列,并设置外边距

# 创建清空学生数据按钮
clear_button = tk.Button(prize_distribution_frame, text="清空学生数据", command=clear_participants, width=30, height=2)  # 创建一个按钮,文本为“清空学生数据”,点击时调用clear_participants函数,宽度30,高度2
clear_button.grid(row=len(prizes) + 2, column=0, columnspan=2, pady=10)  # 将按钮放置在网格布局的第len(prizes)+2行,跨2列,并设置外边距

# 运行主循环
root.mainloop()  # 进入主窗口的消息循环,等待用户操作

 


相关文件下载地址
©下载资源版权归作者所有;本站所有资源均来源于网络,仅供学习使用,请支持正版!

相关文章

微信小程序快乐会领6大瓶可乐福利
用Python加ai写了一个本地音乐播放器
很优秀的孩子,情商智商都高!
用Python加ai调教写了一个经典贪吃蛇游戏
Python写的一个闹钟程序
用Python加ai写了一个定时关机小工具

发布评论

工作需要用Python加ai写了一个积分抽奖程序