推广

Python面向对象实战:学生教师信息管理(5)

iseeyu3年前 (2024-02-21)推广166

学号必须以95开头5位数

三、添加学生信息

1. 需求分析

我们希望打开添加学生信息窗口后,填入学生信息,点击保存按钮后,数据会立即显示在学校信息列表里。

2. 实现过程

为了获取填入的信息,我们在studentservices中定义add方法,将student_current中的各个属性依次添加到current_student_list列表中,再加current_student_list列表加入到总列表list_all中即可。

def add(self):
    """
    添加学生
    """
    # 暂存填入的学生信息
    current_student_list = []
    current_student_list.append(self.student_current.sno)
    current_student_list.append(self.student_current.name)
    current_student_list.append(self.student_current.gender)
    current_student_list.append(self.student_current.birthday)
    current_student_list.append(self.student_current.mobile)
    current_student_list.append(self.student_current.email)
    current_student_list.append(self.student_current.profession)
    current_student_list.append(self.student_current.entry_time)

    # 当前学生添加到集合中
    self.list_all.append(current_student_list)

我们再到studentdetail模块中,将commit方法继续完善,补充添加功能。

current_studentservices.add()

执行add方法后,list_student_all总学生列表已经发生了变化,在明细窗口当我们点击关闭的时候,我们要将变化体现到主窗口的表格中来。
在我们添加完成后定义一个反馈信号给主窗体,

self.userinfo = 1

然后关闭这个明细窗体:

self.destory()

另一边,在主窗体中继续完善add_student方法,在加载添加页面的方法中传入所有学生列表,和当前学生信息。然后获取明细窗体返回的值,刷新学生信息列表的Treeview,这样添加学生信息,并且显示在主窗体表格的功能就实现了。

def add_student(self):
    """
    添加学生信息
    """
    self.flag = 3
    # 加载添加的页面
    detail = StudentDetail(self.flag, self.student_all, self.student_current)
    self.wait_window(detail)
    # 接受返回的值
    get_return_number = detail.userinfo
    # 如果为1 就刷新
    if get_return_number == 1:
        self.load_student_treeview()
3. 效果演示

1.gif

四、修改学生信息

1. 需求分析

上面我们讲了添加学生信息,现在我们继续将修改学生信息。我们需要完成的功能是在主界面表格中选择某一行,点击修改按钮,打开修改明细窗口界面。

2. 实现过程

首先我们在主界面修改学生信息的方法中,在update_student方法中,修改flag,获取当前行的信息,最后再实例化明细窗体界面。这些操作与添加学生信息的过程基本一致,这里不做过多重复讲解。

def update_student(self):
    """
    修改学生信息
    """
    # 修改flag
    self.flag = 2
    # 获取当前行的信息
    item = self.Tree_student.selection()[0]
    current_student = self.Tree_student.item(item,"values")
    for item in self.student_all:
        if current_student[0] == item[0]:
            self.student_current = item
    # 实例化界面
    detail = StudentDetail(self.flag, self.student_all, self.student_current)

接着,我们在明细窗体中队load_gui_by_flag方法再做完善,补充当flag==2的情况。和查看明细窗口一样,我们需要将主窗体表格中选中的学生信息填充到明细窗体中来。由于学号是不允许修改的,所以将学号输入框禁用。

self.Entry_sno["state"] = DISABLED

效果演示:

图片.png

然后在studentservices完善一下update方法,
我们通过循环遍历list_all,判断如果list_all中的学号与current_student学号相同,那么把明细窗体组建中的变量值赋值给list_all中匹配的那个学生信息。

# 主要通关过循环遍历list,修改信息
for index in range(len(self.list_all)):
    if self.list_all[index][0] == self.student_current.sno:
        self.list_all[index][1] = self.student_current.name
        self.list_all[index][2] = self.student_current.gender
        self.list_all[index][3] = self.student_current.birthday
        self.list_all[index][4] = self.student_current.mobile
        self.list_all[index][5] = self.student_current.email
        self.list_all[index][6] = self.student_current.profession
        self.list_all[index][7] = self.student_current.entry_time

数据修改完成后,我们在commit方法中完善修改功能,与添加学生信息的操作一样,我们需要封装当前学生类对象、校验输入的学生信息是否符合要求、调用update方法修改列表、提示用户修改成功、反馈信号给主窗体、最后关闭这个窗体。
然后我们在主窗体界面中接收反馈,并刷新表格。
我们来看一下修改的动作有没有在主窗体表格中表现出来。
这样,我们修改的动作就已经完成了,其实套路和添加学生信息一样,现在我们演示一下将小新的专业改为“物联网”,一下为演示效果:

1.gif

五、删除学生信息

1.需求分析

我们希望这主窗体界面的表格中选中学生,然后点击删除按钮,学生信息就被删除掉。注意,以上包括添加、修改、已经这里的删除,其操作对象都是list,我们还并没有保存到本地文件。写入到本地文件等会我们会统一来做。
删除操作,相对简单,因为它只需要在主界面进行,没有跨越GUI,所有比较方便操作。

2.实现过程

我们首先把student_services模块中的delete方法给写好,我们同样还是通过遍历list_all,然后匹配选中项,根据索引删除该项。

def delete(self):
    # 主要通过循环遍历list,删除某条信息
    for index in range(len(self.list_all)):
        if self.list_all[index][0] == self.student_current.sno:
            # pop是根据索引号来删除的
            self.list_all.pop(index)

紧接着,我们完善主窗体中的delete_studet方法,先获取选中行的数据,然后遍历list_all,找到与被选中学生学号相同的项item,然后把该条学生项封装成一个待删除的对象student_object,实例化student_services后,弹出窗口询问是否删除,如果是则执行删除动作,否则不删除。

def delete_student(self):
    """
    删除学生信息
    """
    # 获取双击行的数据
    item = self.Tree_student.selection()[0]
    current_student = self.Tree_student.item(item, "values")
    student_object = ""
    for item in self.student_all:
        if current_student[0] == item[0]:
            # 封装到student
            student_object = Student(item[1], item[2], item[3], item[4],
                                     item[5], item[0], item[6], item[7])
    # 实例化StudentServices
    current_student_services = StudentServices(self.student_all, student_object)
    # 询问是否删除
    choose = askyesno("删除确认","确认要删除学生信息【学号:"+student_object.sno +
                      ",姓名:"+student_object.name+"】的信息吗?")
    if choose:
        # 执行删除动作
        current_student_services.delete()
        # 提醒删除成功
        showinfo("系统消息", "学生消息删除成功")
        # 更新表格
        self.load_student_treeview()
    else:
        return
3. 效果演示

1.gif

六、保存数据到文件

1. 需求分析

我们以上所做的所有增删改都是对list进行操作,当程序重新打开后又恢复原样了,我们最后需要做的是把操作结果写入到文本文件中。

2. 实现过程

在file类中,我们定义方法write_to_file,先把文本内容清空,然后遍历list_student_all中的每一个项,用,填充在每一个项中,然后去除其中可能存在的换行符,但是在每一行的结束加上换行符。

def write_to_file(self):
    # ============ 把学生信息写入文件 ========
    try:
        # 把原先的文件清空
        with open(self.student_path, mode="w", encoding="UTF-8") as fd_student:
            fd_student.write("")

        with open(self.student_path, mode="a", encoding="UTF-8") as fd_student:
            for item in self.list_student_all:
                temp = ",".join(item)
                temp = temp.replace("\n", "") + "\n" # 取出行中可能存在的换行符
                fd_student.write(temp)
    except Exception as e:
        raise e

写入操作完成后,我们应当设置关闭窗口按钮时触发写入文件操作。
我们需要把窗体关闭按钮的行为转化为方法,在主窗体的构造函数中添加一个把窗体关闭按钮的行为转化为方法的语句。

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

然后在下面定义close_window的方法,点击窗口关闭按钮时跳出弹窗,询问是否保存修改,如果是则调用write_to_file方法写入文件,写入成功后系统弹窗提醒用户已经写入成功,写入成功后关闭窗体即可。

def close_window(self):
    # 询问是否保存修改
    choose= askyesno("关闭前的提醒", "关闭窗体前是否要将修改写入到文件?")
    if choose:
        try:
            self.file_info.write_to_file()
            showinfo("系统提示", "所有的修改已经保存并写入到文件")
            # 关闭窗口
            self.destroy()
        except Exception as e:
            showinfo("系统消息", e)
    else:
        self.destroy()

注意:即使点击否,也要调用destory方法关闭窗口,否则窗体会陷入无法关闭的死循环。

3. 效果演示

1.gif

最后

以上,就是利用面向对象思想实现学生教师信息管理的全部内容了,如果大家能手动完成这个项目,必将对面向对象思想有着更加深刻的理解。
配套的源码及素材可以私信我获取。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57601.html

相关文章

西安企业做百度推广,一个月花三千和花三万到底差在哪?

4|最近跟几个西安的老板聊天,发现一个挺有意思的现象:同样做百度推广,有人一个月花三千块,询盘不断;有人一个月砸三万,水花都没见着。问他们区别在哪,大多数人说不清楚,只知道'钱花了,没效果'。 5| 6|百度推广这东西,说复杂也复杂,说简单也简单。核心就一件事:让你的潜在客户搜某个词的时候,你的信息...

我想当策划,大学应该选什么专业?

我想当策划,大学应该选什么专业?

学,广告,传播,公关,这些专业其实都可以。另外也可以学像汉语言文学,以及一些跟文学相关的一些专业,会对你找工作有帮助。但是,你想从事这个这份职业,除了专业的学习之外,更多的是,你要在上学的时候积极参与一些更营销策划相关的社会实践。比如说你可以做一些兼职,比如说帮别人去写稿,...

服装市场营销策略分析,“定位不慎满盘皆输”

服装市场营销策略分析,“定位不慎满盘皆输”

不同的区域需要不同的策略,而不同的营销策略需要不同的销售思路来配合。因此,在研究女装产品销售思路之前,最好先对于市场与营销策略做一次深入地了解。1.市场区域化(market segmentation):目标营销的第一步,是将整个市场拆分成若干个同性质的小市场。2.目标市场的...

晚间悦读丨你的思维方式,决定你的人生高度!

晚间悦读丨你的思维方式,决定你的人生高度!

越长大,越发现,能够决定你人生高度的,往往是你的认知层次。 你的认知在哪个层级,你的人生就处在什么状态。你认知的高度,决定了你人生的高度。 那如何才能升级方式、提升认知能力呢?可以从这三个方面做出改变。 NO. 1 改变态度 有人...

编写项目营销策划方案六大要点

编写项目营销策划方案六大要点

现在商业发展非常迅速,的需求非常的大,但是要做好营销策划是有一定难度的,我把自己做营销策划的一些体会在这里分享给朋友们。营销策划方案六大要点我们先说项目营销策划方案这个话题。大部分的营销策划人都是在企业里工作,大部分项目之初都是来源于一个想法,创始人、老板或者创始团队的一个...

【商场营销策划】如何进行商场营销策划?

【商场营销策划】如何进行商场营销策划?

商场是策划者们关注的永恒话题,那么究竟该如何作好商场营销策划呢?掌握以下这几点营销策略设计原则,至关重要!1.义利兼顾的原则。商场在获取利润的同时要充分考虑到消费者的合法利益和商场的长远利益。在作商场活动营销策略方案的时候应该将这一点作为首要的原则。对商场有利而对顾客不利的...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片