我的工作是一名培训机构的老师,在面对学生上课的情况,根据学生的表现来奖励对应的积分。同时提高了和学生的互动性,打包好的成品软件在文章底部即可下载(温馨提示:要把电脑的杀毒关闭,它会误报!!!),或者各位需要把代码拿去修改直接将源码修改一下即可:
软件演示:
成品代码:
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() # 进入主窗口的消息循环,等待用户操作
转载请注明:宗宗酱-(电击小子)++>工作需要用Python加ai写了一个积分抽奖程序