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

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

off999 2024-11-15 23:12 27 浏览 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)

效果演示:

最后

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

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

相关推荐

目前最好用的网络电话(哪款网络电话好用)

好用的网络电话软件有爱科手机网络电话软件、阿里通网络电话、skype网络电话、有信、爱聊。1、爱科手机网络电话软件:爱科可以在手机上打网络电话。是一款开放式网络通信软件,融合免费网络电话、免费短信、网...

免费听歌大全(免费听歌大全蒙古歌曲)

答案是,我推荐你去下一个青桃app听歌软件比较好,哪里有海量的免费音乐可以任意随听,免费下载都可以,而且音质都很不错!有许多软件能够免费听歌,以下是一些常见的免费听歌软件:1.Spotify:Spo...

58同城二手车交易网(58同城二手车交易网官网)

58同城上的二手车可以买,有靠谱的,也有不靠谱的。58同城上有真实车主,但更多的是冒充车主的车商,关键取决于消费者的辨别能力。如果是不懂行的个人想买辆靠谱二手车的话,最简单快速的办法还是找个规模大的、...

安卓浏览器(安卓浏览器在哪里打开)

安卓浏览器简单的说就是在安卓手机上使用的浏览器,稍微复杂点就是基于liunx开发的apk程序用于搜索浏览解析文件的一个软件。遵循万维网的HTTP和FTP协议编译网络共享的数据通过搜索引擎转变为我们通常...

海马苹果助手下载官网(海马苹果助手在线下载)

1.当然有用了,推荐海马苹果助手,算是目前国内运行最稳定,性能最佳的一款苹果助手了2.海马玩手机助手还行,功能比较强大,体验很好,无需账户注册,可以直接免费正版应用软件下载安装3.目前比较好用的手机助...

租房子58同城(建湖租房子58同城)

自建房也可以在58同城网发布房租出租信息。首先,你要注册58同城网的账号,就可以发布房屋出租信息。填写的时候填写自有房产“我是房东”,详细填写房租的基本情况,交通情况,对租客的要求等信息,就可以发布了...

qq游戏大厅2025(QQ游戏大厅2025绿色版)

1.可以直接在漫展官方APP中进行购买门票。2.直接去漫展厅购买门票。3.有漫展代购者进行售卖门票,可以去进行购买。而这三种方式是购买漫展门票最快,最安全的购买方式。2023年cm漫展郑州市市区门票可...

看球直播app下载(看球帝app手机版免费下载)

电视直播ios版是一款连接了电视网为您提供电视直播信号的手机直播应用。无论是央视各台还是全国各大卫视都可以在这里免费收看,周五看浙江卫视《中国新歌声》,周六看湖南卫视《快乐大本营》,周末看东方卫视《极...

手机测wifi网速在线测试(我的网速测试)

在手机上进行Wi-Fi测速,您可以使用以下步骤: 1.打开手机的Wi-Fi功能,并连接到要测试的Wi-Fi网络。 2.打开手机浏览器,访问一个在线Wi-Fi测速网站,例如s...

腾讯对战平台官网(腾讯对战平台叫什么名字)

用管理员身份运行试试看,不如换个win7,下载一个小白,10分钟搞定。win7现在是市面上电脑最多的系统,兼容各种游戏辅助,各种游戏,各种办公软件,我自己就是win10,新电脑,我换了7,打开腾讯...

珍爱网(珍爱网免费征婚交友平台)

珍爱网上的人的确是真人,但那些人的资料况你很难判断它的真实性。如何你想在上面找到珍爱,那你得有优秀且真实的资本,要不然珍爱网就是珍爱网而已。灰姑娘很难遇上白马王子,除非你是漂亮的灰姑娘。癞蛤蟆也很难遇...

同城约会的app哪个免费(同城约会的app哪个免费好用)

玩这类app,最关键的不在软件本身,在于个人实力……能不能约到人?肯定有人成功过,我身边就有这样的例子,一哥们在一个叫么么哒的app上面就成功约到过几个妹子吃饭,代价是他在上面花了几万送女孩礼物淘她们...

1 42集免费观看(龙王传说第142集免费观看)

脊梁电视剧可以通过手机央视频APP看42集全,因为这部电视剧是在央视频网络平台上进行独播的去爱奇艺APP或者腾讯视频都可以看到读了《中国通史》,我深深感受到我美丽的祖国一中国历史的悠久文化的深远与美丽...

pp助手源最新地址(pp助手网址是多少)

1、打开Cydia。2、进入Cydia后,点击管理中的【软件源】。3、进入到【软件源】页面,点击【编辑】按钮。4、点击【添加】源按钮,跳出添加源弹窗。5、在弹窗中输入需要添加PP助手源地址http:/...

直接在手机上刷机软件(用手机给手机刷机的软件)

例如使用模拟器就可以第三方的刷机软件,或多或少都是带一点广告的!你要说完全好用的话,只能选奇兔了,奇兔它有专门的ROM移植团队。可以登录它的官网搜索每个品牌的手机的型号都有大神在里面,机型覆盖还是比较...

取消回复欢迎 发表评论: