本文介绍了一个基于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学生姓名比较内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论