百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python GUI项目实战(七)给系统添加修改和删除的功能

off999 2024-11-15 23:12 12 浏览 0 评论

前言

在上一节Python GUI项目实战(六)添加学生信息 中我们实现了添加学生信息的功能,在明细窗体中输入的学生信息并添加到总列表中,与此同时在主窗体的表格中能自动刷新添加的数据。作为一个学生信息管理系统除了具备添加信息的功能,同时也要能够完成修改、删除以及最后的数据保存并写入到文件的功能。

一、修改学生信息

我们有了前面查看学生信息、添加学生信息的操作基础,修改学生信息的功能实现起来就不难了。

操作逻辑:

我们执行修改学生信息的操作逻辑是:

1. 数据载入明细窗体

首先我们要做的是:点击修改按钮载入明细窗体的时候,相应的信息应当被填充进明细窗体中。我们需要在明细窗体的代码中找到load_windows_flag函数,在self.fiag == 3的条件分支下,调用load_student_detail方法加载学生数据。

# 填充数据
self.load_student_detail()

同时在明细窗体的修改模式下,我们设置学号不允许修改:

# 学号不允许修改
self.Entry_sno["state"] = DISABLED

我们修改窗体的时,主窗体应当能获取到选中的学生信息,这样调用明细窗体的时候才会有数据显示。主窗体中修改学生信息对应的方法是update_student,我们对该函数进行完善,我们需要获取某一行的学生数据:

def update_student(self):
    self.action_flag = 3
    item = self.Tree.selection()[0]  
    Temp_student_list = self.Tree.item(item, "values")  
    # 遍历获得完整学生明细信息
    for item in self.all_student_list:
        if item[0] == Temp_student_list[0]:
            self.current_student_list = item
    #载入窗体
    self.load_detail_window()

现在已经完成了,指定学生明细信息的载入,以及窗体状态的修改。

效果演示:

2. 对all_student_list指定项进行修改

接下来我们就要完成修改完成后提交的功能: 我们要在明细窗体的代码中找到commit函数,在self.flag == 3也就是修改状态下的操作逻辑。 由于我们从主窗体传递过来有两个列表,一个是all_student_list和current_student_list。怎样根据currrent_student_list来修改all_student_list列表中的内容呢? 我们对all_student_list列表中的内容进行遍历,如果每一条数据与当前明细窗体中的数据的第一项“学号”匹配,那么就把all_student_list对应该索引的数据修改为采集到的当前明细窗体中的数据。

代码如下:

# 把当前界面中的数据存储在集合中
temp_list = []
if len(str(self.Entry_sno.get()).strip()) == 0:
    showinfo("系统消息", "学号不能为空!")
    return
else:
    temp_list.append(str(self.Entry_sno.get()).strip())
    temp_list.append(str(self.Entry_name.get()).strip())
    if self.var_gender.get() == 1:
        temp_list.append("男")
    else:
        temp_list.append("女")
    temp_list.append(str(self.Entry_age.get()).strip())
    temp_list.append(str(self.Entry_mobile.get()).strip())
    temp_list.append(str(self.Entry_email.get()).strip())
    temp_list.append(str(self.Entry_home.get()).strip())
    temp_list.append(str(self.Entry_id.get()).strip())
    temp_list.append(str(self.Entry_studyin.get()).strip())
    temp_list.append(str(self.Entry_pro.get()).strip())
    temp_list.append(str(self.Entry_emcon.get()).strip())
    temp_list.append(str(self.Entry_emtel.get()).strip())
# 遍历集合
for index in range(len(self.all_student_list)):
    if self.all_student_list[index][0] == self.current_student_list[0]:
        self.all_student_list[index] = temp_list

3. 反馈信息

此时我们的all_student_list列表已经发生了修改,我们要让主窗体的TreeView中的表格立刻发生变化,我们就需要把明细窗体的操作反馈信息给主窗体。 我们可以显示:数据修改成功、反馈信号给主窗体、然后关闭明细窗体。

# 提醒
showinfo("系统消息","学生信息修改成功!")
# 反馈信号给主窗体
self.userinfo = 1
# 关闭窗体
self.destroy()

然后我们在主窗体的代码中的update_student方法中继续完善,接收明细窗体的明细信号。

if self.load_detail_window() == 1:
    self.load_all_student()
else:
    return

至此我们学生信息的修改工作就已经完成了!

效果演示:


二、删除学生信息

思路:



1. 获取用户选择的数据

和前面修改学生信息的操作一样,使用selection方法获取TreeView中的选中信息

item = self.Tree.selection()[0]
Temp_student_list = self.Tree.item(item, "values")

2. 提醒用户是否删除

(1)调用询问窗体

这里我们可以使用Tkinter提供的另一种窗体提示信息askyesno,用户选择确认或取消,该函数就会返回对应的1或者0。我们把询问窗体askyesno返回的值存储在变量choose中,然后在if语句里判断,如果用户选择了yes,则执行删除动作。否则什么都不做。

(2)删除的用户信息

我们遍历all_student_list列表,对每条学生信息的第一个元素(学号)与前面获取到的Temp_student_list的第一个元素(学号)进行判断。如果相等,则使用pop()方法对all_student_list对应的数据项进行删除操作。否则,这就break跳出上一级的遍历操作。

# 询问是否删除
choose = askyesno("删除确认","确定要删除该学生【学号:"+Temp_student_list[0]+",姓名:"+
         Temp_student_list[1]+"】的信息吗?")
if choose:
    # 执行删除动作
    for index in range(len(self.all_student_list)):
        if self.all_student_list[index][0] == Temp_student_list[0]:
            self.all_student_list.pop(index)
            break
    showinfo("系统消息","删除成功!")
else:
    return

3. 更新表格

删除操作执行完成后,TreeView中的表格需要立刻更新。由于删除操作直接是在主窗体中进行的,就不需要和前面一样再设置反馈信号了,直接调用载入全部学生信息的方法即可。

    # 更新表格
    self.load_all_student()

效果演示:

三、保存学生信息

以上我们学生信息的增删查改的功能,但是数据全部都存储在all_student_list中,并没有写入到文件磁盘中。我们希望在关闭窗体的时候触发写入操作,系统会弹出窗体提醒是否将修改保存到系统?如果选择“yes”则保存到文件系统中,如果选择“no”则不保存直接关闭。 这里的写入操作涉及到两个动作:原文件清空;all_student_list数据写入。

1.关闭窗体

(1)出现的问题

我们点击系统窗体上的"叉号"如何触发事件?

(2)解决方案

我们可以利用tkinter提供的protocol方法,捕获窗体的行为并转化为方法。在主窗体构造函数中添加这个方法:

self.protocol("WM_DELETE_WINDOW",self.close_window)

就可以把点击窗体叉号的行为转化为自动执行close_window的方法。 我们在主窗体中定义close_window方法:

def close_window(self):
    # 给用户提示:是否要保存数据
    choose = askyesno("关闭前提醒","关闭窗体前是否要将修改写入文件")
    if choose:
        try:
            with open(self.file_path,mode = "w",encoding="UTF-8") as fd:
                fd.write("")
            with open(self.file_path,mode="w",encoding="UTF-8") as fd:
                for item in self.all_student_list:
                    temp = ",".join(item)
                    temp = temp.replace("\n","")+"\n"
                    fd.write(temp)
        except:
            showinfo("系统消息","写入文件出现异常")
        # 提醒
        showinfo("系统消息","所有的修改已经写入到文件")
        # 关闭
        self.destroy()
    else:
        self.destroy()

2.写入文件

做好窗体的关闭的捕获,我们就需要写入文件了,写入文件时,我们要做好异常处理,先把文件内容清空,再将all_student_list列表中的数据写入到文件中。

(1)出现的问题

我们添加的学生信息的数据项由于结尾没有换行符,在添加多个学生信息时,写入的字符都会集中在一行。如果我们直接在每个学生信息数据项后添加换行符,这也是不可取的,因为在原始列表中已经有了换行符。

(2)解决方法:

统一把原始数据项中的换行符都去掉,再添加换行符。这样不管之前有没有,现在都只有一个换行符。

for item in self.all_student_list:
    temp = ",".join(item)
    temp = temp.replace("\n","")+"\n"
    fd.write(temp)

效果演示:

最后

至此,我们学生学生信息管理系统最基础的增删查改存就已经全部完成了!下一节,我们继续讲解如何实现用户密码的修改,敬请期待吧~

慢慢干货,创作不易,如果觉得文章还不错的话,希望能点个赞;嘻嘻,感谢你的支持。另外本项目所有素材、源码、数据源直接私信我即可免费获取,共同学习。

相关推荐

Python钩子函数实现事件驱动系统(created钩子函数)

钩子函数(HookFunction)是现代软件开发中一个重要的设计模式,它允许开发者在特定事件发生时自动执行预定义的代码。在Python生态系统中,钩子函数广泛应用于框架开发、插件系统、事件处理和中...

Python函数(python函数题库及答案)

定义和基本内容def函数名(传入参数):函数体return返回值注意:参数、返回值如果不需要,可以省略。函数必须先定义后使用。参数之间使用逗号进行分割,传入的时候,按照顺序传入...

Python技能:Pathlib面向对象操作路径,比os.path更现代!

在Python编程中,文件和目录的操作是日常中不可或缺的一部分。虽然,这么久以来,钢铁老豆也还是习惯性地使用os、shutil模块的函数式API,这两个模块虽然功能强大,但在某些情况下还是显得笨重,不...

使用Python实现智能物流系统优化与路径规划

阅读文章前辛苦您点下“关注”,方便讨论和分享,为了回馈您的支持,我将每日更新优质内容。在现代物流系统中,优化运输路径和提高配送效率是至关重要的。本文将介绍如何使用Python实现智能物流系统的优化与路...

Python if 语句的系统化学习路径(python里的if语句案例)

以下是针对Pythonif语句的系统化学习路径,从零基础到灵活应用分为4个阶段,包含具体练习项目和避坑指南:一、基础认知阶段(1-2天)目标:理解条件判断的逻辑本质核心语法结构if条件:...

[Python] FastAPI基础:Path路径参数用法解析与实例

查询query参数(上一篇)路径path参数(本篇)请求体body参数(下一篇)请求头header参数本篇项目目录结构:1.路径参数路径参数是URL地址的一部分,是必填的。路径参...

Python小案例55- os模块执行文件路径

在Python中,我们可以使用os模块来执行文件路径操作。os模块提供了许多函数,用于处理文件和目录路径。获取当前工作目录(CurrentWorkingDirectory,CWD):使用os....

python:os.path - 常用路径操作模块

应该是所有程序都需要用到的路径操作,不废话,直接开始以下是常用总结,当你想做路径相关时,首先应该想到的是这个模块,并知道这个模块有哪些主要功能,获取、分割、拼接、判断、获取文件属性。1、路径获取2、路...

原来如此:Python居然有6种模块路径搜索方式

点赞、收藏、加关注,下次找我不迷路当我们使用import语句导入模块时,Python是怎么找到这些模块的呢?今天我就带大家深入了解Python的6种模块路径搜索方式。一、Python模块...

每天10分钟,python进阶(25)(python进阶视频)

首先明确学习目标,今天的目标是继续python中实例开发项目--飞机大战今天任务进行面向对象版的飞机大战开发--游戏代码整编目标:完善整串代码,提供完整游戏代码历时25天,首先要看成品,坚持才有收获i...

python 打地鼠小游戏(打地鼠python程序设计说明)

给大家分享一段AI自动生成的代码(在这个游戏中,玩家需要在有限时间内打中尽可能多的出现在地图上的地鼠),由于我现在用的这个电脑没有安装sublime或pycharm等工具,所以还没有测试,有兴趣的朋友...

python线程之十:线程 threading 最终总结

小伙伴们,到今天threading模块彻底讲完。现在全面总结threading模块1、threading模块有自己的方法详细点击【threading模块的方法】threading模块:较低级...

Python信号处理实战:使用signal模块响应系统事件

信号是操作系统用来通知进程发生了某个事件的一种异步通信方式。在Python中,标准库的signal模块提供了处理这些系统信号的机制。信号通常由外部事件触发,例如用户按下Ctrl+C、子进程终止或系统资...

Python多线程:让程序 “多线作战” 的秘密武器

一、什么是多线程?在日常生活中,我们可以一边听音乐一边浏览新闻,这就是“多任务处理”。在Python编程里,多线程同样允许程序同时执行多个任务,从而提升程序的执行效率和响应速度。不过,Python...

用python写游戏之200行代码写个数字华容道

今天来分析一个益智游戏,数字华容道。当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏。前几天写2048的时候,又想起了这个游戏,想着来研究一下。游戏玩法用尽量少的步数,尽量...

取消回复欢迎 发表评论: