基于Python编写一个学生姓名比较工具

 更新时间:2025年10月13日 10:08:45   作者:封奚泽优  
这篇文章主要为大家详细介绍了如何使用Python Tkinter编写一个学生姓名比较工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

本文介绍了一个基于Python Tkinter的学生姓名比较工具,在班级收集信息有时候是通过在线文档或者微信群的接龙,会有查漏补缺的需求,一个个去比对太浪费时间,这个时候可以通过程序来实现名单快速的核对。

该工具通过图形界面提供两个文本框用于输入两组学生姓名,支持逗号、分号、顿号、回车等多种分隔符。点击"比较"按钮后,程序会解析输入的姓名,统计并显示两组学生总数、共同拥有的学生数,以及每组独有的学生名单。界面设计采用网格布局,包含可滚动的文本区域和结果展示区,窗口居中显示且大小可调。该工具适用于快速对比两组学生名单的差异,方便教育工作者进行数据核对。

完整代码

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


class StudentComparator:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("学生姓名比较工具")
        self.root.resizable(True, True)

        # 设置窗口居中
        self.center_window(900, 700)

        # 创建界面
        self.create_widgets()

    def center_window(self, width, height):
        """将窗口居中显示"""
        screen_width = self.root.winfo_screenwidth()
        screen_height = self.root.winfo_screenheight()

        x = (screen_width - width) // 2
        y = (screen_height - height) // 2

        self.root.geometry(f"{width}x{height}+{x}+{y}")

    def create_widgets(self):
        """创建界面组件"""
        # 主框架 - 使用grid布局以便更好地控制各区域大小
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.pack(fill=tk.BOTH, expand=True)

        # 配置主框架的网格权重
        main_frame.columnconfigure(0, weight=1)
        main_frame.rowconfigure(1, weight=1)  # 文本区域行
        main_frame.rowconfigure(3, weight=1)  # 结果区域行

        # 说明标签
        instruction_label = ttk.Label(
            main_frame,
            text="请在下方两个文本框中粘贴学生姓名列表(支持逗号、分号、顿号、回车等分隔符)",
            wraplength=800
        )
        instruction_label.grid(row=0, column=0, sticky="w", pady=(30, 10))

        # 创建左右两个文本框的框架
        text_frame = ttk.Frame(main_frame)
        text_frame.grid(row=1, column=0, sticky="nsew", pady=(0, 10))

        # 配置网格权重,使两侧等宽
        text_frame.columnconfigure(0, weight=1)
        text_frame.columnconfigure(1, weight=1)
        text_frame.rowconfigure(0, weight=1)

        # 左侧文本框和标签
        left_frame = ttk.Frame(text_frame)
        left_frame.grid(row=0, column=0, sticky="nsew", padx=(0, 5))

        left_label = ttk.Label(left_frame, text="第一组学生姓名:")
        left_label.pack(anchor=tk.W, pady=(0, 5))

        self.left_text = tk.Text(left_frame, wrap=tk.WORD)
        self.left_text.pack(fill=tk.BOTH, expand=True)

        left_scrollbar = ttk.Scrollbar(left_frame, orient=tk.VERTICAL, command=self.left_text.yview)
        left_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.left_text.config(yscrollcommand=left_scrollbar.set)

        # 右侧文本框和标签
        right_frame = ttk.Frame(text_frame)
        right_frame.grid(row=0, column=1, sticky="nsew", padx=(5, 0))

        right_label = ttk.Label(right_frame, text="第二组学生姓名:")
        right_label.pack(anchor=tk.W, pady=(0, 5))

        self.right_text = tk.Text(right_frame, wrap=tk.WORD)
        self.right_text.pack(fill=tk.BOTH, expand=True)

        right_scrollbar = ttk.Scrollbar(right_frame, orient=tk.VERTICAL, command=self.right_text.yview)
        right_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.right_text.config(yscrollcommand=right_scrollbar.set)

        # 按钮框架
        button_frame = ttk.Frame(main_frame)
        button_frame.grid(row=2, column=0, sticky="ew", pady=10)

        compare_button = ttk.Button(button_frame, text="比较", command=self.compare_names)
        compare_button.pack(side=tk.LEFT, padx=(0, 10))

        clear_button = ttk.Button(button_frame, text="清空", command=self.clear_text)
        clear_button.pack(side=tk.LEFT)

        # 结果框架 - 增加高度
        result_frame = ttk.LabelFrame(main_frame, text="比较结果", padding="5")
        result_frame.grid(row=3, column=0, sticky="nsew", pady=(10, 0))

        # 配置结果框架内部的网格权重
        result_frame.columnconfigure(0, weight=1)
        result_frame.rowconfigure(0, weight=1)

        self.result_text = tk.Text(result_frame, wrap=tk.WORD, state=tk.DISABLED, font=("Arial", 10))
        self.result_text.grid(row=0, column=0, sticky="nsew")

        result_scrollbar = ttk.Scrollbar(result_frame, orient=tk.VERTICAL, command=self.result_text.yview)
        result_scrollbar.grid(row=0, column=1, sticky="ns")
        self.result_text.config(yscrollcommand=result_scrollbar.set)

    def parse_names(self, text):
        """解析文本中的姓名,支持多种分隔符"""
        # 使用正则表达式分割文本,支持中文标点和换行符
        separators = r'[,,;;、\s\n]+'
        names = re.split(separators, text.strip())

        # 过滤空字符串并去除前后空格
        names = [name.strip() for name in names if name.strip()]

        return set(names)

    def compare_names(self):
        """比较两个文本框中的姓名"""
        left_text = self.left_text.get("1.0", tk.END)
        right_text = self.right_text.get("1.0", tk.END)

        if not left_text.strip() and not right_text.strip():
            messagebox.showwarning("警告", "两个文本框都为空,请输入学生姓名!")
            return

        # 解析姓名
        left_names = self.parse_names(left_text)
        right_names = self.parse_names(right_text)

        # 找出不同的姓名
        only_in_left = left_names - right_names
        only_in_right = right_names - left_names
        common_names = left_names & right_names

        # 显示结果
        self.result_text.config(state=tk.NORMAL)
        self.result_text.delete("1.0", tk.END)

        self.result_text.insert(tk.END, f"第一组学生总数: {len(left_names)}\n")
        self.result_text.insert(tk.END, f"第二组学生总数: {len(right_names)}\n")
        self.result_text.insert(tk.END, f"共同拥有的学生数: {len(common_names)}\n\n")

        self.result_text.insert(tk.END, "仅在第一组中的学生:\n")
        if only_in_left:
            for name in sorted(only_in_left):
                self.result_text.insert(tk.END, f"  • {name}\n")
        else:
            self.result_text.insert(tk.END, "  无\n")

        self.result_text.insert(tk.END, "\n仅在第二组中的学生:\n")
        if only_in_right:
            for name in sorted(only_in_right):
                self.result_text.insert(tk.END, f"  • {name}\n")
        else:
            self.result_text.insert(tk.END, "  无\n")

        self.result_text.config(state=tk.DISABLED)

    def clear_text(self):
        """清空所有文本框"""
        self.left_text.delete("1.0", tk.END)
        self.right_text.delete("1.0", tk.END)
        self.result_text.config(state=tk.NORMAL)
        self.result_text.delete("1.0", tk.END)
        self.result_text.config(state=tk.DISABLED)

    def run(self):
        """运行程序"""
        self.root.mainloop()


if __name__ == "__main__":
    app = StudentComparator()
    app.run()

结果图如下 

到此这篇关于基于Python编写一个学生姓名比较工具的文章就介绍到这了,更多相关Python学生姓名比较内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python装饰器原理与用法分析

    Python装饰器原理与用法分析

    这篇文章主要介绍了Python装饰器原理与用法,结合实例形式分析了Python装饰器的概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下
    2018-04-04
  • 在python中bool函数的取值方法

    在python中bool函数的取值方法

    今天小编就为大家分享一篇在python中bool函数的取值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • pytorch之关于PyTorch结构介绍

    pytorch之关于PyTorch结构介绍

    这篇文章主要介绍了pytorch之关于PyTorch结构的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • python实现图书管理系统

    python实现图书管理系统

    这篇文章主要为大家详细介绍了python实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 在Python中处理字符串之isdigit()方法的使用

    在Python中处理字符串之isdigit()方法的使用

    这篇文章主要介绍了在Python中处理字符串之isdigit()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • 快速上手基于Anaconda搭建Django环境的教程

    快速上手基于Anaconda搭建Django环境的教程

    Django具有完整的封装,开发者可以高效率的开发项目,Django将大部分的功能进行了封装,开发者只需要调用即可,接下来通过本文给大家介绍基于Anaconda搭建Django环境的教程,需要的朋友可以参考下
    2021-10-10
  • PyTorch中的nn.ConvTranspose2d模块详解

    PyTorch中的nn.ConvTranspose2d模块详解

    nn.ConvTranspose2d是PyTorch中用于实现二维转置卷积的模块,广泛应用于生成对抗网络(GANs)和卷积神经网络(CNNs)的解码器中。该模块通过参数如输入输出通道数、卷积核大小、步长、填充等,能控制输出尺寸和避免棋盘效应
    2024-09-09
  • Python中subprocess模块用法实例详解

    Python中subprocess模块用法实例详解

    这篇文章主要介绍了Python中subprocess模块用法,实例分析了subprocess模块的相关使用技巧,需要的朋友可以参考下
    2015-05-05
  • python中关于提升工作效率的一些小技巧

    python中关于提升工作效率的一些小技巧

    这篇文章主要介绍了python中关于提升工作效率的一些小技巧,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 如何使用 python查询Amazon DynamoDB

    如何使用 python查询Amazon DynamoDB

    本文介绍了如何使用Python Boto3在Amazon DynamoDB上查询DynamoDB 表、创建、列出和执行其他 CRUD 活动以及执行其他维护任务,本文给大家介绍的非常详细,需要的朋友参考下
    2023-06-06

最新评论