tkinter 库(设计图形界面系统)

几何管理的应用

# tkinter 库
是Python的标准GUI库,提供了创建图形用户界面的功能。 tkinter是一个跨平台的GUI库,支持Windows、macOS和Linux等操作系统。它是Python的标准库之一,无需额外安装。
#tkinter.Entry 是 Tkinter 的输入框控件类,调用它来创建一个新的文本输入框。

pack()包装 组件,允许你在父组件中添加子组件。pack()方法会将组件放置在父组件的顶部或底部,并自动调整大小和位置。

#padx 和pady 是pack方法的一个参数,表示在组件左右和上下添加的间距,单位是像素。
# fill="x" 是 pack() 布局的核心参数之一,用于控件的水平自适应      适用于需要控件动态响应窗口大小变化的场景(常与 expand =True 结合使用)

#grid()网格 布局管理器,允许你在父组件中创建一个网格,将组件放置在指定的行和列中。grid()方法允许你更精确地控制组件的位置和大小。
#columns 是grid方法把标签放置在第0行第0列网格单元格 设置sticky=“w”/“e” (左/右对齐) “n”/“s” (上/下对齐) “nsew” (四个方向对齐)”
#Sticky 是运用grid方法的一个参数,表示在组件上下添加的间距,单位是像素。

palce() 位置 管理器,允许你在父组件中指定组件的确切位置和大小。place()方法允许你使用绝对坐标来放置组件。

*实际应用案例《学生管理系统》

在这里插入图片描述

# 1、按系统需求分析,设计至少5个功能模块。
# 2、利用python程序设计编写UI界面, UI中需要有:button组件、label组件、Entry组件、布局等PythonTurtle画扇形。
# 3、该系统中的模块具有增、删、改、查的功能,查询页面等。
# 4、系统能应用Python程序流程结构、组合数据类型、函数、异常处理、文件操作、标准库、第三方库、类和对象等知识。
# 5、整个系统要运行流畅,不能出现异常的问题
# 6、系统要有注释,代码要规范,符合PEP8规范。
# 7、系统要有完整的文档,包含需求分析、设计说明书、测试报告等。

#tkinter 是Python的标准GUI库,提供了创建图形用户界面的功能。 tkinter是一个跨平台的GUI库,支持Windows、macOS和Linux等操作系统。它是Python的标准库之一,无需额外安装。
    #tkinter.Entry 是 Tkinter 的输入框控件类,调用它来创建一个新的文本输入框。

# 几何管理的应用
# pack()包装 组件,允许你在父组件中添加子组件。pack()方法会将组件放置在父组件的顶部或底部,并自动调整大小和位置。
    #padx 和pady 是pack方法的一个参数,表示在组件左右和上下添加的间距,单位是像素。
    # fill="x" 是 pack() 布局的核心参数之一,用于控件的水平自适应      适用于需要控件动态响应窗口大小变化的场景(常与 expand =True 结合使用)
#grid()网格  布局管理器,允许你在父组件中创建一个网格,将组件放置在指定的行和列中。grid()方法允许你更精确地控制组件的位置和大小。
    #columns 是grid方法把标签放置在第0行第0列网格单元格      设置sticky=“w”/“e”  (左/右对齐) “n”/"s” (上/下对齐)  “nsew”  (四个方向对齐)"  
    #Sticky 是运用grid方法的一个参数,表示在组件上下添加的间距,单位是像素。
# palce() 位置   管理器,允许你在父组件中指定组件的确切位置和大小。place()方法允许你使用绝对坐标来放置组件。



import tkinter as tk
from tkinter import messagebox, ttk
import pickle
import os

class StudentManagementSystem:
    def __init__(self, root):
        self.root = root
        self.root.title("学生管理系统")
        self.root.geometry("800x600")
        self.root.resizable(False, False)

        # 学生数据存储
        self.students = []
        self.load_data()

        # 创建UI
        self.create_ui()

    def load_data(self):
        """加载学生数据"""
        if os.path.exists("students.dat"):
            try:
                with open("students.dat", "rb") as file:
                    self.students = pickle.load(file)
            except Exception as e:
                messagebox.showerror("错误", f"加载数据失败: {e}")

    def save_data(self):
        """保存学生数据"""
        try:
            with open("students.dat", "wb") as file:
                pickle.dump(self.students, file)
        except Exception as e:
            messagebox.showerror("错误", f"保存数据失败: {e}")

    def create_ui(self):
        """创建UI界面"""
        # 标题
        title_label = tk.Label(self.root, text="学生管理系统", font=("Arial", 16, "bold"))
        title_label.pack(pady=10)

        # 输入区域
        input_frame = tk.Frame(self.root)
        input_frame.pack(pady=10, fill="x", padx=20)

        # 学号
        tk.Label(input_frame, text="学号:").grid(row=0, column=0, padx=5, pady=5, sticky="w")
        self.id_entry = tk.Entry(input_frame, width=20)
        self.id_entry.grid(row=0, column=1, padx=5, pady=5)

        # 姓名
        tk.Label(input_frame, text="姓名:").grid(row=0, column=2, padx=5, pady=5, sticky="w")
        self.name_entry = tk.Entry(input_frame, width=20)
        self.name_entry.grid(row=0, column=3, padx=5, pady=5)

        # 年龄
        tk.Label(input_frame, text="年龄:").grid(row=1, column=0, padx=5, pady=5, sticky="w")
        self.age_entry = tk.Entry(input_frame, width=20)
        self.age_entry.grid(row=1, column=1, padx=5, pady=5)

        # 性别
        tk.Label(input_frame, text="性别:").grid(row=1, column=2, padx=5, pady=5, sticky="w")
        self.gender_entry = tk.Entry(input_frame, width=20)
        self.gender_entry.grid(row=1, column=3, padx=5, pady=5)

        # 操作按钮
        button_frame = tk.Frame(self.root)
        button_frame.pack(pady=10, fill="x", padx=20)

        tk.Button(button_frame, text="添加学生", command=self.add_student).pack(side=tk.LEFT, padx=5)
        tk.Button(button_frame, text="删除学生", command=self.delete_student).pack(side=tk.LEFT, padx=5)
        tk.Button(button_frame, text="修改学生", command=self.update_student).pack(side=tk.LEFT, padx=5)
        tk.Button(button_frame, text="查询学生", command=self.search_student).pack(side=tk.LEFT, padx=5)

        # 学生列表
        self.tree = ttk.Treeview(self.root, columns=("ID", "Name", "Age", "Gender"), show="headings")
        self.tree.heading("ID", text="学号")
        self.tree.heading("Name", text="姓名")
        self.tree.heading("Age", text="年龄")
        self.tree.heading("Gender", text="性别")
        self.tree.pack(pady=10, fill="both", expand=True, padx=20)

        # 绑定双击事件
        self.tree.bind("<Double-1>", self.on_double_click)

        # 搜索栏
        search_frame = tk.Frame(self.root)
        search_frame.pack(pady=10, fill="x", padx=20)

        tk.Label(search_frame, text="搜索:").pack(side=tk.LEFT, padx=5)
        self.search_entry = tk.Entry(search_frame, width=30)
        self.search_entry.pack(side=tk.LEFT, padx=5)
        tk.Button(search_frame, text="搜索", command=self.search_student).pack(side=tk.LEFT, padx=5)

        # 刷新列表
        self.refresh_student_list()

    def refresh_student_list(self):
        """刷新学生列表"""
        for item in self.tree.get_children():
            self.tree.delete(item)

        for student in self.students:
            self.tree.insert("", "end", values=(student["id"], student["name"], student["age"], student["gender"]))

    def add_student(self):
        """添加学生"""
        try:
            id = self.id_entry.get().strip()
            name = self.name_entry.get().strip()
            age = self.age_entry.get().strip()
            gender = self.gender_entry.get().strip()

            if not id or not name or not age or not gender:
                messagebox.showwarning("警告", "请填写所有字段")
                return

            if not age.isdigit():
                messagebox.showwarning("警告", "年龄必须是数字")
                return

            # 检查学号是否已存在
            for student in self.students:
                if student["id"] == id:
                    messagebox.showwarning("警告", "学号已存在")
                    return

            self.students.append({"id": id, "name": name, "age": age, "gender": gender})
            self.save_data()
            self.refresh_student_list()
            self.clear_entries()
            messagebox.showinfo("成功", "学生添加成功")
        except Exception as e:
            messagebox.showerror("错误", f"添加学生失败: {e}")

    def delete_student(self):
        """删除学生"""
        try:
            selected_item = self.tree.selection()
            if not selected_item:
                messagebox.showwarning("警告", "请选择要删除的学生")
                return

            item_id = self.tree.item(selected_item, "values")[0]

            for i, student in enumerate(self.students):
                if student["id"] == item_id:
                    del self.students[i]
                    self.save_data()
                    self.refresh_student_list()
                    messagebox.showinfo("成功", "学生删除成功")
                    return
        except Exception as e:
            messagebox.showerror("错误", f"删除学生失败: {e}")

    def update_student(self):
        """修改学生"""
        try:
            selected_item = self.tree.selection()
            if not selected_item:
                messagebox.showwarning("警告", "请选择要修改的学生")
                return

            item_id = self.tree.item(selected_item, "values")[0]

            for student in self.students:
                if student["id"] == item_id:
                    id = self.id_entry.get().strip()
                    name = self.name_entry.get().strip()
                    age = self.age_entry.get().strip()
                    gender = self.gender_entry.get().strip()

                    if not id or not name or not age or not gender:
                        messagebox.showwarning("警告", "请填写所有字段")
                        return

                    if not age.isdigit():
                        messagebox.showwarning("警告", "年龄必须是数字")
                        return

                    student["id"] = id
                    student["name"] = name
                    student["age"] = age
                    student["gender"] = gender

                    self.save_data()
                    self.refresh_student_list()
                    messagebox.showinfo("成功", "学生信息修改成功")
                    return
        except Exception as e:
            messagebox.showerror("错误", f"修改学生失败: {e}")

    def search_student(self):
        """查询学生"""
        try:
            keyword = self.search_entry.get().strip()
            if not keyword:
                self.refresh_student_list()
                return

            for item in self.tree.get_children():
                self.tree.delete(item)

            for student in self.students:
                if (keyword in student["id"] or
                    keyword in student["name"] or
                    keyword in student["age"] or
                    keyword in student["gender"]):
                    self.tree.insert("", "end", values=(student["id"], student["name"], student["age"], student["gender"]))
        except Exception as e:
            messagebox.showerror("错误", f"查询学生失败: {e}")

    def on_double_click(self, event):
        """双击事件处理"""
        try:
            selected_item = self.tree.selection()
            if not selected_item:
                return

            item_values = self.tree.item(selected_item, "values")
            self.id_entry.delete(0, tk.END)
            self.name_entry.delete(0, tk.END)
            self.age_entry.delete(0, tk.END)
            self.gender_entry.delete(0, tk.END)

            self.id_entry.insert(0, item_values[0])
            self.name_entry.insert(0, item_values[1])
            self.age_entry.insert(0, item_values[2])
            self.gender_entry.insert(0, item_values[3])
        except Exception as e:
            messagebox.showerror("错误", f"双击事件处理失败: {e}")

    def clear_entries(self):
        """清空输入框"""
        self.id_entry.delete(0, tk.END)
        self.name_entry.delete(0, tk.END)
        self.age_entry.delete(0, tk.END)
        self.gender_entry.delete(0, tk.END)

if __name__ == "__main__":
    root = tk.Tk()
    app = StudentManagementSystem(root)
    root.mainloop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值