access 子窗体 鼠标滚动不工作_Python GUI项目实战(五)明细信息窗体的完善

前言

上一节我们实现了明细窗体GUI的搭建,并且设置了查看、修改、添加三种不同的状态,框架搭建好了,内容并没有填充,本节我们继续完善这个项目,将学生信息填充进明细窗体中。


一、填充当前学生信息

1.需求

目前我们已经实现的功能是在主窗体双击表格任一行,弹出明细窗体。我们我们需要做的是:将主窗体中对应的学生信息传递到明细窗体中并显示在明细窗体中。

2.思路

既然要设计主窗体向子窗体的数据传递功能,就要准备好主窗体的传递和子窗体的接收。

(1)子窗体部分

子窗体(明细窗体)做好接收参数的准备 我们首先在明细窗体的构造函数中添加一个参数current_student类型为list类型,再定义一个全局变量来接收这个参数传来的值。

self.current_student_list = current_student

然后定义一个加载学生明细信息的函数(如果获取到的当前学生信息为空,则通过弹出对话框提醒用户没有任何数据需要展示,否则将传递过来的学生信息列表依次传递给当前界面的字符变量):

def load_student_detail(self):    if len(self.current_student_list) == 0:        showinfo("系统消息","没有任何数据需要展示!")    else:        self.var_sno.set(self.current_student_list[0])  # 学号        self.var_name.set(self.current_student_list[1])  # 姓名        if "男" in self.current_student_list[2]:         # 性别            self.var_gender.set(1)        else:            self.var_gender.set(2)        self.var_age.set(self.current_student_list[3])  # 生日        self.var_mobile.set(self.current_student_list[4])  # 电话号码        self.var_email.set(self.current_student_list[5])  # 邮箱        self.var_address.set(self.current_student_list[6])  # 地址        self.var_id.set(self.current_student_list[7])  # 身份证号        self.var_studyin.set(self.current_student_list[8])  # 入学时间        self.var_pro.set(self.current_student_list[9])  # 专业        self.var_emcon.set(self.current_student_list[10])  # 紧急联系人        self.var_emtel.set(self.current_student_list[11])  # 紧急联系号码

在载入窗体标记的函数中,将load_student_detail()函数添加进去。 好了,明细窗体这边的接收已经准备得差不多了,我们开始动手修改主窗体的传递部分的代码:

(2)主窗体部分

主窗体要准确获取在treeview中选中的学生信息数据 我们主窗体这边调用明细窗体的函数参数要与明细窗体的构造函数保持一致,所以我们先添加一个全局变量

self.current_student_list = []

用来存储在主窗口中,选中的学生明细信息。 我们点击TreeView中的学生信息表格,怎么样让系统知道我们点击了,那一个呢? 其实我们可以设置双击某一行的触发条件,所以在主窗体的setup_UI函数结尾添加点击事件

self.Tree.bind("", self.view_student)

这里的表示监听鼠标左键双击,通过bind方法绑定执行view_student()方法。 这里我们再完善一下view_student()方法,首先因为设置了点击事件,所以view_student()需要再添加一个参数event,然后我们使用selection()方法获取所选某行的标识符。 由于主窗体的TreeView表格只显示了学生明细信息的部分内容,而我们明细窗体则需要显示全部内容。所以我们设计下面这个方法:

通过鼠标双击表格中的某一行,获取该行的标识符,然后使用item()方法通过标识符获取该行的所有数据。我们把这些数据的第一个元素(学号)与all_student_list(全部学生信息)的每一项进行逐个遍历,如果匹配到了,则返回all_student_list中的该项学生信息,并将该学生信息存储在全局变量self.current_student_list中。

这样,在调用子窗体时,加上self.all_student_list参数,那么子窗体的构造函数就能正确接收到列表,这样就能实现学生明细窗体信息的显示。

代码如下:

def view_student(self,event):    self.action_flag = 1    # 获取Tree表格双击某一行的数据,selection()如果没有指定参数,则表明以列表形式返回所有的item    item = self.Tree.selection()[0] # 获取双击某一行的项目标识符    # 这个Tree表格中的数据,只是显示了部分数据,为了显示明细窗体,我们需要加载文件中的读取出来的完整信息    Temp_student_list = self.Tree.item(item,"values")   # 通过item方法,获取该列的所有元素,以元组的形式返回    # 遍历获得完整学生明细信息    for item in self.all_student_list:        if item[0] == Temp_student_list[0]:            self.current_student_list = item    self.load_detail_window()def load_detail_window(self):    detail_window = detailgui.DetailWindow(self.action_flag,self.current_student_list)

效果展示:

41a61618299d18d21d300121d5d1fa79.gif

明细窗体数据填充完成

二、控制控件的状态

1. 问题的引出

前面我们已经实现了学生明细窗体的数据填充,但是仍有一些不合理的地方,比如,我们在查看学生信息的时候,输入框都是可编辑状态,这是不合理的,只有在编辑模式下才可以修改信息,在查看状态下输入框应该设置为只读模式,且保存按钮为不可以状态。我们该如何实现呢?

2. 解决思路

和前面设置不同状态下明细窗体标题一样,我们在load_windows_flag()方法下,添加属性控制控件的状态。 (1)隐藏按钮可用使用对应的布局名称加forget方法来实现。 (2)使输入框设置为不可用状态,可用设置state参数值为DISABLED 代码如下:

# 控制控件的状态self.Button_save.place_forget()self.Entry_sno["state"] = DISABLEDself.Entry_name["state"] = DISABLEDself.Radio_man["state"] = DISABLEDself.Radio_woman["state"] = DISABLEDself.Entry_age["state"] = DISABLEDself.Entry_id["state"] = DISABLEDself.Entry_mobile["state"] = DISABLEDself.Entry_email["state"] = DISABLEDself.Entry_home["state"] = DISABLEDself.Entry_studyin["state"] = DISABLEDself.Entry_pro["state"] = DISABLEDself.Entry_emcon["state"] = DISABLEDself.Entry_emtel["state"] = DISABLED

注意:控件的构建和布局不要图方便写在一条语句里,否则如果后面要对这个控件的属性进行修改的话系统就会报错!

现在我们的明细窗体的搭建已经基本完成了:

  • 学生明细信息数据全部填充完毕;
  • 保存按钮处于消失状态;
  • 各个输入框都是只读状态

效果演示

fe8034cb5ebd860d9372d57ed995bec4.gif

明细窗体输入框控件只读模式,保存按钮消失

最后

本节我们实现了明细窗体学生信息的自动填充显示的功能,以及一些符合常规逻辑的控件设定。我们需要思考的是:学生信息存储的形式以及数据是如何传递的还有显示信息的时候是怎么遍历的?这种方法有什么缺陷,有没有更好的方法?还有一点我们需要注意的是:布局时不要图方便直接在构建控件后就使用布局,这样会导致后面对控件的属性进行修改时,系统报错。这些都是我们需要注意的地方。


好啦,目前为止,我们主窗体左边栏的按钮基本都没有完善,下一节我们将实现点击添加按钮,实现添加学生信息的功能,并直接在主窗体的TreeView中立即刷新,敬请期待吧~

如果觉得文章还不错的话,欢迎点赞关注评论转发支持一下,嘻嘻,另外,本项目全部源码、素材、数据源直接私信即可获取~

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

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

相关文章

弹性式分布数据集RDD——Pyspark基础 (二)

连载中:http://ihoge.cn/tags/pyspark/ title: 弹性式分布数据集RDD——Pyspark基础 (二) date: 2018-04-15 17:59:21 comments: true categories: - Spark tags: - pyspark RDD的内部运行方式 RDD不仅是一组不可变的JVM(…

导师都有哪些“秘密”没有告诉你?

全世界只有3.14 % 的人关注了爆炸吧知识真正决定人与人之间的差距的,其实是我们对事物的见识与内心的格局,见识的深浅决定人生的深浅,格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号,希望能够给你带…

2021年全球知名开源项目大更新

下面简单回顾 2021 年一些带来较大变化和影响的项目更新信息。PHP 8.1.0 正式发布枚举,只读属性,First-class 可调用语法,新的初始化器,纯交集类型,Never 返回类型,Final 类常量,显式八进制数字…

mysql workbench_爬虫实例:玩转mysql(预备篇)

考完试的第一篇文章,开心~/1.什么是数据库/数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程…

RHEL6   Kickstart 无人值守安装

方法:FTPTFTPDHCPKickstartPXE从网络引导系统的做法可以不必从硬盘、软盘或者CD-ROM光盘,而是完全通过网络来引导一台计算机。这对于安装来说很方便,因为它意味着你可以坐在桌子旁边,不必走到机器那里插入CD&#xff0…

免安装免配置 还免费的Spark 集群 --Databrickes Spark Clould

http://ihoge.cn/2018/Databrickes.html 摘要:本文带你畅游Databrickes Spark Clould云服务。小白迅速上手大数据Spark开发环境,从此告别集群Bug的烦恼,彻底解放物理机负担让你随时随地想Run就Run��。 目录&#xff…

C# 运算符的优先级和关联性

表1 显示了 C#运算符的优先级,其中顶部的运算符有最高的优先级(即在包含多个运算符的表达式中,最先计算该运算符)。除了运算符优先级,对于二元运算符,需要注意运算符是从左向右还是从右向左计算。除了少数运…

char *a 与char a[] 的区别和char** argv与char *argv[]区别

char *a 与char a[] 的区别 char *a "hello" 中的a是指向第一个字符‘a的一个指针 char a[20] "hello" 中数组名a也是执行数组第一个字符‘h’的指针 但二者并不相同: 看实例:把两个字符串相加: 结果: hell…

arduino代码_纯纯小白开发arduino--我的调试经验

arduino 是什么我就不做介绍了。这里的小白并不是说我没有嵌入式开发经验而是说从来没有实际开发过arduino。虽然它在世界范围内都很流行,可是不知为何国内专业做嵌入式开发的人对它大多都嗤之以鼻。我对arduino的想法是:”不管黑猫白猫,抓到…

重要的ui组件——Behavior

v7包下的组件类似CoordinatorLayout推出也有一段时间了,大家使用的时候应该会体会到其中很多的便利,今天这篇文章带大家来了解一个比较重要的ui组件——Behavior。从字面意思上就可以看出它的作用,就是用来规定某些组件的行为的,那…

Spark的基本架构

http://ihoge.cn/2018/IntroductionToSpark.html Spark的基本架构 当单机没有足够的能力和资源来执行大量信息的计算(或者低延迟计算),这时就需要一个集群或一组机器将许多机器的资源集中在一起,使我们可以使用全部累积的在一起…

简析TCP的三次握手与四次分手

TCP是什么? 具体的关于TCP是什么,我不打算详细的说了;当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续。它只是一个超级麻烦的协议,而它又是互联网的基础&am…

for循环延时_前端中的事件循环eventloop机制

我们知道 js 是单线程执行的,那么异步的代码 js 是怎么处理的呢?例如下面的代码是如何进行输出的:console.log(1);setTimeout(function() { console.log(2);}, 0);new Promise(function(resolve) { console.log(3); resolve(Date.no…

androidActivity生命周期

Activity生命周期Activity是一个用来提供用户交互界面的组件,它是四大组件之一,对于我们刚刚学习android的菜鸟来说是非常重要的,我们可以将一个屏幕理解为一个Activity,Activity通常是一个全屏的界面,每一个应用程序可…

Autofac实现有条件的DI

Autofac.Annotation框架是我用.netcore写的一个DI框架,基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成。开源地址:https://github.com/yuzd/Autofac.Annotation本期讲的是最新实现的功能有条件的DI有些时候我们想…

公众平台关注用户达到5万即可开通流量主功能 可以推广APP应用

今天微信公众平台发布发布了一些更新,公众帐号的关注用户达到5万,即可开通流量主功能,之前的是要求10万粉丝,这是一个微信开放的信号。广告主可推广苹果商店应用或腾讯开放平台应用。新增卡片和图文广告规格。以下是微信团队的公告…

二进制全排列 java_排列组合算法真厉害,傻瓜都能学会

作者:枕边书来源:https://zhenbianshu.github.io/2019/01/charming_alg_permutation_and_combination.html需求最近工作中碰到一个需求:我们的数据表有多个维度,任意多个维度组合后进行 group by 可能会产生一些”奇妙”的反应&am…