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

news2025/4/2 22:05:19

几何管理的应用

# 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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2325995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在线文档协作工具选型必看:14款产品对比

本文将深入对比14款在线文档协作工具&#xff1a;PingCode; 2. Worktile; 3. 语雀; 4. 金山文档; 5. WPS云文档; 6. Google Docs; 7. 轻雀文档; 8. Microsoft 365 Online; 9. 明道云文档等。 在数字化办公日益普及的今天&#xff0c;企业对高效协同的需求不断升级&#xff0c;在…

Java虚拟机JVM知识点(持续更新)

JVM内存模型 介绍下内存模型 根据JDK8的规范&#xff0c;我们的JVM内存模型可以拆分为&#xff1a;程序计数器、Java虚拟机栈、堆、元空间、本地方法栈&#xff0c;还有一部分叫直接内存&#xff0c;属于操作系统的本地内存&#xff0c;也是可以直接操作的。 详细解释一下 程…

【计算机网络】HTTP与HTTPS

文章目录 1. HTTP定义2. HTTP交互3. HTTP报文格式3.1 抓包工具-fiddler3.2 抓包操作3.3 报文格式3.3.1 请求报文3.3.2 响应报文 4. URL5. 请求头中的方法6. GET和POST的区别7. HTTP报头7.1 Host7.2 Content_Length7.3 Content_Type7.4 User-Agent(UA)7.5 Referer7.6 Cookie 8 状…

数据结构:树的5种存储方案详解(C语言完整实现)

数据结构中的树结构常用来存储逻辑关系为 "一对多" 的数据。树结构可以细分为两类&#xff0c;分别是二叉树和非二叉树&#xff08;普通树&#xff09;&#xff0c;存储它们的方案是不一样的&#xff1a; 二叉树的存储方案有 2 种&#xff0c;既可以用顺序表存储二叉…

【蓝桥杯】 枚举和模拟练习题

系列文章目录 蓝桥杯例题 枚举和模拟 文章目录 系列文章目录前言一、好数&#xff1a; 题目参考&#xff1a;核心思想&#xff1a;代码实现&#xff1a; 二、艺术与篮球&#xff1a; 题目参考&#xff1a;核心思想&#xff1a;代码实现: 总结 前言 今天距离蓝桥杯还有13天&…

WebGL图形编程实战【3】:矩阵操控 × 从二维到三维的跨越

上一篇文章&#xff1a;WebGL图形编程实战【2】&#xff1a;动态着色 纹理贴图技术揭秘 仓库地址&#xff1a;github…、gitee… 矩阵操控 矩阵变换 回到前面关于平移缩放、旋转的例子当中&#xff0c;我们是通过改变传递进去的xy的值来改变的。 在进行基础变换的时候&…

如何把数据从SQLite迁移到PostgreSQL

## 如何把数据从SQLite迁移到PostgreSQL 文章目录 1、DB-Engines 中的SQLite 和 PostgreSQL2、SQLite安装和测试2.1、编译安装SQLite2.2、数据测试 3、Postgresql安装和测试3.1、编译安装postgresql3.2、测试 4、pgloader安装5、数据迁移和验证5.1、准备参数文件5.2、数据迁移…

Qt使用QGraphicsView绘制线路图————附带详细实现代码

文章目录 0 效果1 核心1.1 简单示例1.1.1 解读 1.2 创建用户交互1.2.1 完整示例 1.3 创建图形元1.3.1 绘制直线1.3.2 绘制贝塞尔曲线1.3.3 绘制图片 1.4 移动的小车 2 使用自定义视图类参考 0 效果 视图中包含线路、道岔、信号灯、火车。 下图为站点信号灯&#xff1a; 下图…

【Linux】调试器——gdb使用

目录 一、预备知识 二、常用指令 三、调试技巧 &#xff08;一&#xff09;监视变量的变化指令 watch &#xff08;二&#xff09;更改指定变量的值 set var 正文 一、预备知识 程序的发布形式有两种&#xff0c;debug和release模式&#xff0c;Linux gcc/g出来的二进制…

【数据分享】2000—2024年我国乡镇的逐年归一化植被指数(NDVI)数据(年最大值/Shp/Excel格式)

之前我们分享过2000-2024年我国逐年的归一化植被指数&#xff08;NDVI&#xff09;栅格数据&#xff0c;该逐年数据是取的当年月归一化植被指数&#xff08;NDVI&#xff09;的年最大值&#xff01;另外&#xff0c;我们基于此年度栅格数据按照行政区划取平均值&#xff0c;得到…

Shell 不神秘:拆解 Linux 命令行的逻辑与效率

初始shell shell的概述 什么是shell 本质 shell本质是脚本文件&#xff1a;完成批处理。 比如 有一个文件 中十个文件&#xff0c;这十个文件中每个文件又有是个子文件&#xff0c;由人来处理&#xff0c;很麻烦&#xff0c;但如果写一个脚本文件&#xff0c;让脚本来替我…

win 远程 ubuntu 服务器 安装图形界面

远程结果&#xff1a;无法使用docker环境使用此方法 注意要写IP和:数字 在 ubuntu 服务器上安装如下&#xff1a; # 安装 sudo apt-get install tightvncserver # 卸载 sudo apt purge tightvncserver sudo apt autoremove#安装缺失的字体包&#xff1a; sudo apt update s…

大模型高质量rag构建:A Cheat Sheet and Some Recipes For Building Advanced RAG

原文&#xff1a;A Cheat Sheet and Some Recipes For Building Advanced RAG — LlamaIndex - Build Knowledge Assistants over your Enterprise DataLlamaIndex is a simple, flexible framework for building knowledge assistants using LLMs connected to your enterpris…

【Qt】游戏场景和图元

一&#xff1a;图元 advance函数&#xff1a; 在 Qt 框架里&#xff0c;QGraphicsItem 是用于在 QGraphicsScene 中绘制图形项的基类。advance(int phase) 是 QGraphicsItem 类的一个虚函数&#xff0c;其主要用途是让图形项在场景的动画或更新过程里完成特定的逻辑操作。 p…

开源的CMS建站系统可以随便用吗?有什么需要注意的?

开源CMS建站系统虽然具有许多优点&#xff0c;但并非完全“随便用”。无论选哪个CMS系统&#xff0c;大家在使用的时候&#xff0c;可以尽可能地多注意以下几点&#xff1a; 1、版权问题 了解开源许可证&#xff1a;不同的开源CMS系统采用不同的开源许可证&#xff0c;如GPL、…

初始ARM

ARM最基础的组成单元。 最小系统&#xff1a;能系统能够正常工作的最少器件构成的系统 。 一、CPU基础定义 1. 核心定位 计算机三大核心部件&#xff1a; CPU&#xff08;运算与控制&#xff09;内部存储器&#xff08;数据存储&#xff09;输入/输出设备&#xff08;数据交互…

DataPlatter:利用最少成本数据提升机器人操控的泛化能力

25年3月来自中科院计算所的论文“DataPlatter: Boosting Robotic Manipulation Generalization with Minimal Costly Data”。 视觉-语言-动作 (VLA) 模型在具身人工智能中的应用日益广泛&#xff0c;这加剧对多样化操作演示的需求。然而&#xff0c;数据收集的高成本往往导致…

诠视科技MR眼镜如何安装apk应用

诠视科技MR眼镜如何安装apk应用 1、使用adb工具安装1.1 adb工具下载1.2 解压adb文件1.3 使用adb安装apk1.4 常用adb命令 2、拷贝到文件夹安装 1、使用adb工具安装 1.1 adb工具下载 点击下面的链接开始下载adb工具&#xff0c;下载结束以后解压文件。 下载链接: https://down…

搭建前端环境和后端环境

搭建前端环境 ①、安装vscode&#xff0c;并安装相应的插件工具 ②、安装node.js&#xff0c;可以选择当前版本&#xff0c;或者其他版本 ③、创建工作区 创建一个空文件夹&#xff0c;然后通过vscode工具打开&#xff0c;保存为后缀名为.code-workspace ④、从gitee…

Polhemus FastScan 单摄像头3D激光扫描器

FastSCAN Cobra是Polhemus公司研制的手持激光扫描仪。与以前的产品比较&#xff0c;它节省了30&#xff05;的费用&#xff0c;体积也减小了一半 &#xff0c;但仍然保留了所有功能&#xff0c;使用和携带都更加方便。作为超小的手持激光扫描仪,FastSCAN Cobra对扫描三维物体具…