Python利用Tkinter制作随机点名程序(第11节)


在学校,每个老师的教学方式都不一样,而最常见的方法就是随机点名学生进行回答问题。当老师开始点名的时候,教室里都会特别的安静,几乎每个人都低头不敢和老师对视,生怕被老师点名,因为如果答不上来或者写不出来都会感觉很丢脸。为了提高点名效率,可以通过随机点名程序完成点名过程。

1、随机点名程序功能介绍

随机点名程序可以帮助教师或会议主持人等在特殊场合随机抽取一个或多个人员进行回答问题、发表意见等。在本节教程中,我们将使用Python实现一个随机点名系统软件,可以通过Tkinter库创建一个简单的图形界面应用程序。首先,打开随机点名程序,在输入框中输入参与者名单,接着使用random模块进行随机抽取。最后,通过Tkinter库的ScrolledText控件输出随机点名结果。 其中,random模块的使用是实现随机点名功能的核心,通过输入的参与者名单中随机选择一个或多个结果,可以快速高效地完成点名。

在Tkinter中实现随机点名主要通过以下步骤来完成:

初始化Tkinter窗口:创建一个基本的Tkinter窗口。

文本输入框:用于输入所有参与者的名字,每行写一个名字。

抽取数量输入框:允许用户输入要抽取的人数。

随机抽取逻辑:使用Python的random模块来实现随机抽取。

开始点名按钮:用于触发随机抽取的函数。

显示结果:将抽取的结果显示在图形界面上。

2、随机点名程序界面演示

‌Python利用Tkinter制作随机点名程序

3、随机点名程序总代码

动手练一练:

import tkinter as tk
from tkinter import messagebox, scrolledtext
import random
import time

# 封装随机点名逻辑
class Call_Name:
    def __init__(self, app):
        self.app = app
        self.app.title("随机点名工具")

        # 设置主窗口居中
        screen_width = self.app.winfo_screenwidth()
        screen_height = self.app.winfo_screenheight()
        app_width = 400
        app_height = 600
        x = (screen_width - app_width) / 2
        y = (screen_height - app_height) / 2
        self.app.geometry("%dx%d+%d+%d" % (app_width, app_height, (x + 160), y))
        # 设置窗口不可放大或缩小
        self.app.resizable(0, 0)

        # 创建标签
        self.all_label = tk.Label(app, text="请输入参与者名单,每行一个名字:")
        self.all_label.pack(pady=10)

        # 创建垂直滚动条
        self.scrollbar = tk.Scrollbar(app, orient="vertical")
        self.scrollbar.pack(side="right", fill="y")

        # 创建输入框ScrolledText小部件,用于输入参与者名单,并配置滚动条
        self.names_text = scrolledtext.ScrolledText(app, yscrollcommand=self.scrollbar.set, height=10, width=30)
        self.names_text.pack(padx=20, pady=10, fill="both", expand=True)

        # 将滚动条与ScrolledText小部件关联
        self.scrollbar.config(command=self.names_text.yview)

        # 在ScrolledText控件中插入默认文本
        self.names_text.insert(tk.END, "张三\n李四\n")

        # 创建标签
        self.label_widget = tk.Label(app, text="随机点名数量:")
        self.label_widget.pack()

        # 创建输入框,用于输入抽取数量
        self.entry_widget = tk.Entry(app)
        self.entry_widget.pack()

        # 创建点名按钮
        self.start_button = tk.Button(app, text="开始点名", command=self.pick_names)
        self.start_button.pack(pady=10)

        # 创建结果显示区域
        self.result_label = tk.Label(app, text="随机点名结果:")
        self.result_label.pack(pady=10)

        # 创建输入框ScrolledText小部件,用于显示随机点名结果,并配置滚动条
        self.result_text = scrolledtext.ScrolledText(app, yscrollcommand=self.scrollbar.set, height=10, width=30)
        self.result_text.pack(padx=20, pady=10, fill="both", expand=True)

        # 将滚动条与ScrolledText小部件关联
        self.scrollbar.config(command=self.result_text.yview)

        # 创建一个标签,用于显示时间
        self.time_label = tk.Label(app, font=('Arial', 18))
        self.time_label.pack(padx=20, pady=20)

    # 创建一个随机点名函数
    def pick_names(self):
        # 获取所有名字
        names = self.names_text.get("1.0", "end-1c").strip().split("\n")
        if len(names) < 1:
            messagebox.showerror("错误", "请输入至少一个名字!")
            return

        # 获取用户输入的随机抽取数量
        num_results = self.entry_widget.get()
        # 判断是否有效整数
        try:
            num_results = int(num_results)
        except ValueError:
            messagebox.showwarning("警告", "请输入一个有效的整数!")
            return

        # 随机抽取n个名字
        try:
            if num_results <= 0 or num_results > len(names):
                raise ValueError("请输入一个有效的正整数,且不大于参与者总数。")
            # 随机选择n个不重复的名字
            selected_names = random.sample(names, num_results)
            result = "\n".join(selected_names)
            # 清空结果文本框
            self.result_text.delete("1.0", "end")
            # 显示随机抽取结果
            self.result_text.insert("1.0", result)
        except ValueError as e:
            messagebox.showerror("错误", str(e))

    # 显示时间
    def get_time(self):
        time2 = time.strftime('%Y-%m-%d %H:%M:%S')
        self.time_label.config(text=time2)  # 更新标签显示的时间
        self.time_label.after(1000, self.get_time)

    # 运行主循环
    def run(self):
        self.app.mainloop()

# 当前模块直接被执行
if __name__ == "__main__":
    # 创建主窗口
    app = tk.Tk()
    window = Call_Name(app)
    window.get_time()
    window.run()