Python GUI项目实战(七)给系统添加修改和删除的功能
liebian365 2024-10-26 13:00 6 浏览 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)
效果演示:
最后
至此,我们学生学生信息管理系统最基础的增删查改存就已经全部完成了!下一节,我们继续讲解如何实现用户密码的修改,敬请期待吧~
慢慢干货,创作不易,如果觉得文章还不错的话,希望能点个赞;嘻嘻,感谢你的支持。另外本项目所有素材、源码、数据源直接私信我即可免费获取,共同学习。
相关推荐
- 快递查询教程,批量查询物流,一键管理快递
-
作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...
- 一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递
-
对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...
- 快递查询单号查询,怎么查物流到哪了
-
输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...
- 3分钟查询物流,教你一键批量查询全部物流信息
-
很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...
- 快递单号查询,一次性查询全部物流信息
-
现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...
- 快递查询工具,批量查询多个快递快递单号的物流状态、签收时间
-
最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...
- 快递查询软件,自动识别查询快递单号查询方法
-
当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...
- 教你怎样查询快递查询单号并保存物流信息
-
商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...
- 简单几步骤查询所有快递物流信息
-
在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...
- 物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号
-
最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...
- 连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息
-
快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...
- 快递查询教程,快递单号查询,筛选更新量为1的单号
-
最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...
- 掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析
-
在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...
- 从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息
-
在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...
- 物流单号查询,在哪里查询快递
-
如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)