柠檬少年|Python GUI项目实战(四)实现学生明细窗体GUI的设计( 二 )

效果演示:
柠檬少年|Python GUI项目实战(四)实现学生明细窗体GUI的设计明细窗体的GUI框架
二、加载明细窗体加载学生明细信息我们应该设置三种状态:查看、添加、修改;
1. 功能需求

  • 在查看状态下 , 标题是:查看学生明细 , 各信息栏输入框中所有的信息都是只读状态 , 并且右下角的保存按钮处于隐藏状态;
  • 在添加状态下 , 标题是:添加学生明细 , 各信息栏输入框清空 , 右下角保存按钮可用;
  • 在修改状态下 , 标题是:修改学生明细 , 各信息栏除学号不能修改外 , 其余信息栏均可修改 , 并且右下角保存按钮可用 。
2. 触发条件我们实现查看学生明细信息的三种状态的触发条件:
柠檬少年|Python GUI项目实战(四)实现学生明细窗体GUI的设计3. 遇到问题为了能查看学生明细信息 , 我们要在主窗体中定义一个函数load_detail_window(),在此之前我们要导入detailgui模块 , 调用DetailWindow类;
import detailguidef load_detail_window(self):detail_window = detailgui.DetailWindow()接着 , 我们再定义一个add_student的函数 , 在这个函数中调用load_detail_window方法
def add_student(self):self.load_detail_window()然后在按钮中添加command参数 , 其值为add_student; 这样做似乎貌似实现了简单的加载学生明细窗体的功能 , 实际上当我们执行程序 , 点击添加学生按钮后 , 系统会报错
_tkinter.TclError: image "pyimage4" doesn't exist这是什么原因呢?在tkinter里面有一个类Tk,其功能是产生一个主窗体 , 我们前面每次创建窗体时都用到了它 。 但是在tkinter里有一个规定 , 应用程序同时只能运行一个主窗体 。 而这里我们的主窗体一直在运行 , 是没有办法再加载一个主窗体(明细信息)的 。 如果想同时加载两个窗体 , 第二个窗体必须要以子窗体的形式打开 , 这里我们就可以使用Toplevel来创建子窗体 。
所以 , detialgui的DetailWindow类所继承的类应该由Tk , 换成Toplevel即可 。这时候又出现了一个小bug,pane与明细窗体发生了脱离 , 这是因为我们前面创建pane容器的时候忘记设置它的属主了 , 这里添加一个构建函数中添加一个self参数就可以了 。 现在点击添加学生按钮 , 就可以正常加载明细信息窗口了!
柠檬少年|Python GUI项目实战(四)实现学生明细窗体GUI的设计弹出明细窗体
所以 , 出现这个问题的根源所在就是:使用Tk这个类实例化一个窗体 , 这个窗体是一个主窗体 。 已经实例化了一个主窗体 , 再实例化一个是不可以的 。 所以第二个窗体必须用Toplevel实例化 。
三、实现三种状态加载明细窗体1. 点击按钮触发前面我们已经实现了添加明细信息的功能 , 现在我们继续实现修改明细信息的功能 。 我们新定义一个update_student()函数:
def update_student(self):self.load_detail_window()然后在修改学生按钮中添加command参数即可 。
2. 双击表格触发我们想双击TreeView中的某一行表格 , 就能触发查看明细信息的功能 , 首先我们定义一个查看明细信息的方法view_student(),由于双击是一个事件 , 所以在调用函数的时候需要添加一个参数event
def view_student(self,event):self.load_detail_window()然后在 setup_UI()函数的结尾处 , 添加触发双击表格某一行的事件 , 写法是:使用bind()方法 , 第一个参数一定要以Double开头 , 体现是一个双击事件 , 第二个函数为对应的触发函数 。


推荐阅读