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

成品代码:
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() # 进入主窗口的消息循环,等待用户操作
宗宗酱
