• wxFormBuilder + Python 工具开发第三章-日记本工具树节点增、改、删功能


    目录

    前言

    一、添加树右击菜单

    二、新增

    1、实现二级日期节点新增

    2、实现三级文章节点新增

    三、修改

    四、删除


    前言

    上一章节实现了对目记本表数据设计,数据库连接,数据展示的功能

    wxFormBuilder + Python 工具开发第二章-日记本工具数据连接与展示_魂尾ac的博客-CSDN博客

    本章节实现对树节点的增、改、删,等功能

    文章功能内容

    wxF右击菜单添加(wxF是wxFormBuilder缩写)

    wxF新增修改对话框添加

    新增、修改、删除前端后台逻辑开发

    本节最终效果图

    一、添加树右击菜单

    步骤1、添加菜单项

    在wFX里的MaminFrame里添加一个wxMenu菜单,

    在其下添加三个wxMenuItem菜单项,新增、修改、删除

    每个菜单项都绑定一选择事件函数

    步骤2、树右击事件

    选中m_nodetree: wxTreeCtrl 在右边Events里找到OnRightDown,绑定一下事件函数on_pop_right_menu

    步骤3、更新python代码

    将更新的python代码复制到工程代码的noname.py文件里

    步骤4、newWindow.py覆盖

    将新增的四个响应函数在newWindow.py文件里覆盖掉

    并在on_pop_right_menu里添加弹出菜单代码   

    1.  def on_pop_right_menu(self, event):
    2.        #弹出菜单
    3.      self.PopupMenu(self.right_click_menu)
    4.  def On_add_node(self, event):
    5.      event.Skip()
    6.  def On_change_node(self, event):
    7.        event.Skip()
    8.  def On_del_node(self, event):
    9.        event.Skip()

            

    步骤5、运行

    运行runMain.py,打开窗体

    在树上右击,打开右击菜单,如下图,展示了新增、修改、删除三个菜单项

    将菜单的响应按钮添加打印语句,如下

    再次运行,依次点击新增、修改、删除菜单,检查打印结果

    好、右击菜单已经完成,下面开始做节点新增功能

    二、新增

    在新增树节点前呢,笔者发现树表中少了个字段,level,节点等级字段,所以现在给加上

    新增一列,命名为level,对应节点的level值都加上,根目录为1,日期为2,文章标题为3

    修改后运行程序,不会发生任何改变,level字段仅作后台逻辑判断用。

    1、实现二级日期节点新增

    它将自动生成当天日期节点,不需要弹框命名。

    日期有限制不能与其它二级节点日期相同,一天不能生成两个二级节点

    只有选择根节点生成,在选择二、三级节点时,无法新增二级节点,

    步骤1、在newWindow.py文件的on_add_node函数里编写通过level字段判断来添加不同类型的节点,代码如下

            验证一下:

    选择根目录,右击选择新增菜单,查看打印

    选择二级目录,右击选择新增菜单,查看打印

    选择三级目录,右击选择新增菜单,查看打印

    步骤2、只有选择根节点生成,在选择二、三级节点时,无法新增二级节点,这一点需求完成了,现在开始实现另外两个需求。

    它将自动生成当天日期节点,不需要弹框命名。

    日期有限制不能与其它二级节点日期相同,一天不能生成两个二级节点

    需要用到datatime库

    import datetime

    from datetime import datetime

    这两种方式引datetime库,个人喜欢第种,第一种使用起来在重要编写两次datetime。

    获取当前时间,datetime.datetime.now()

    第二种导入方式只需要写一次: datetime.now()

    在newWindow.py文件的NewWindow类中添加add_day_node函数与is_today_in_my_tree函数

    add_day_nod来生成当前天日期数据与节点,is_today_in_my_tree是判断日期是否在my_tree里面存在。

    代码如下

    在On_add_node的level==1判断下调用add_day_node,验证一下,今天还没生成数据的打印

    下一步开始编写添加数据与节点代码了,添加节点时不影响当前选择,要做成单节点添加,不要做重新加载树的功能,会显的很low。

    要将最新数据重新读取到my_tree里去,防止重复添加二级(日期)节点的BUG

    Ps:前面我们有树表中添加level字段,所以新增树节点的sql要跟进添加level字段的写入,在sqliteio.py的insert_treeNode_data函数中

    并且添加commit事务提交句话,并将新增成功数据的id返回

    插入节点数据

    通过insert_treeNode_data方法内的sql语,需要参数data[‘tree_node’: ‘axxx’, ‘parent_id’: 1 , ‘level’: 2],

    所以在newWindow.py的add_day_node添加代码

    增加树节点

    代码编写如下

    在调用的地方添加个返回值打印,

    运行,选择根目录,右击菜单新增,检查效果如下图。

    此时还可以添加二组个相同的日期节点,这是个逻辑BUG

    所以我们还得在添加节点后面增加一行重新加载m_tree数据的代码

    运行,将重复两条数据都删除掉,再次新增两次,可以看到第一次成功,第二次失败

    二级(日期)节点增加完毕,下面开始做三级节点增加了,

    2、实现三级文章节点新增

    三级目录,是文章的标题,随意命名,所以会弹出对话框,对话框中有编辑框,确认/取消按钮

    步骤1、添加对话框

    在wxF里面添加对话框,布局,名称编辑框,确认/取消按钮,按照下面的顺序添加,元素与事件须跟进。

    1. 添加对话框元素 Froms----Dialog , name:NewNodeDlg,title:新增文章节点,id:wxID_ADD_NODE size:280;130
    2. 添加布局1 :Loyout----wxBoxSizer,orient:wxVERTICAL(纵向)
    3. 在布局下添加文字编辑框 Common----wxTextCtrl,name:m_nodeName,id:wxID_NODENAME,size:270;30
    4. 在布局下添布局1-1: Loyout----wxBoxSize,orient:wxHORIZONTAL(横向)

    5)在布局添加确认按钮:Common----wxButton, name:m_confirm,label: 确认,id:wxID_CONFIRM,size:130;30,响应事件Events函数--OnButtonClick: on_confirm

    取消按钮Common----wxButton, name:m_cancel,label: 取消,id:wxID_CANCEL,size:130;30,响应事件Events函数--OnButtonClick: on_cancel

    检查生成的代码,一个崭新的类NewNodeDlg

    步骤2、弹出对话框

    1)新对话框生成一个新的类,在代码目录NodeBook/template下新增newNOdedlg.py文件,将新生成的代码copy进去,版本异常代码修改好

    1. 在NodeBook/manage目录下新增newNode.py文件,其中添加如下代码,继承NewNodeDlg类,按钮的响应函数也覆盖一下
    1. from NodeBook.template.newNodedlg import NewNodeDlg
    2. class NewNode(NewNodeDlg):
    3.     # Virtual event handlers, overide them in your derived class
    4.     def on_confirm(self, event):
    5.         event.Skip()
    6.         print('确认')
    7.     def on_cancel(self, event):
    8.         event.Skip()
    9.         print('取消')

    1. 还不能弹出对话框,我们是要将对话框在主窗体中的树上右击新增菜单新增,判断是二级节点后展示。

    所以先要将对话框在主窗体中创建一个对象,所以在newWindow.py里导入NewNode类构造函数中加入创建对像语句

    from NodeBook.manage.newNode import NewNode

    .....

    self.andlg = NewNode(self)

    再需要在On_add_node函数中的node[‘level’] == 2的判断下添加self.andlg.show()语句

    4)好了,此时弹出对话框的代码已经写完,运行runMain.py

    选择对二级节点,右击-新增,对话框弹出如下

    接下来便可在确认按钮的响应函数中添加相关逻辑了,

    步骤3、添加‘修改’菜单兼容代码

    在添加前,我们可以确认一个东西,‘修改’菜单也需要用到对话框,一事不凡二主,继续用这个对话框来修改功能

    二者都可用一个对话框的前题是在NewNode类中添加一个初始化函数,定义三个参数,

    参数一type,用来判断新或修改;

    参数二data,用来接收节点数据,一个设置新增与修改类型的函数,

    参数三item,传父节点或原节点对象。

    在 set_open_data函数里会传入这三种数据

    1.     def __init__(self, parent):
    2.         super().__init__(parent)
    3.         #数据
    4.         self.data = {}
    5.         #操作类型,0新增/1修改
    6.         self.type = 0
    7. #父节点或源节点
    8. self.item = None
    9.     def set_open_data(self, type, data,item):
    10.         '''
    11.         show对话前设置相关数据
    12.         :param type: 0为新增,1为修改
    13.         :param data: 新增时,data为父节点数据,
    14. :param item: 父节点或源节点对象
    15.         :return:
    16.         '''
    17.         if type == 0:
    18.             self.SetTitle('新增文章节点')
    19.         else:
    20.             self.SetTitle('修改文章节点')
    21.         self.type = type
    22.         self.data = data
    23. self.item = item

    然后在NewWindow类中的新增响应函数On_add_node与修改响应函数On_change_node里添加调用set_open_data函数的代码,新增传0, 修改传1

    新增: 

    1.  self.andlg.set_open_data(0, data, tree_item)
    2.  self.andlg.ShowModal()

    修改: 

    1.  # 获取当前选择的节点对象
    2.   tree_item = self.m_nodetree.GetSelection()
    3.   # 获取当前节点的data
    4.   data = self.m_nodetree.GetItemData(tree_item)
    5.   self.andlg.set_open_data(1, data, tree_item)
    6.   self.andlg.ShowModal()

    PS:这里的Show()函数改ShowModal(),是使对话框模态话,模态话就是对话框不关闭,后面的主框体不可以被点击,类似于浏览器中的蒙板loading

    运行,树节点二级目录右击菜单新增

    关闭对话框后,再右击菜单修改

            

    好,相关与修改菜单兼容的功能已经完成。

    步骤4、新增三级文章目录

    新增的最后一步操作是,确认,所以在确认按钮的响应函数里添加逻辑

    在NewNode类中on_confirm添加逻辑

    1)判断是新增还是修改

     2)增加一个add_new_node的函数,在里面添加增加的逻辑:

    a、获取 编辑框 的文字

            

    编辑的对象是m_nodeName, 编写代码

    node_text = self.m_nodeName.GetLineText(0)

    b、将获取到的 文字 与 parent_id = data[‘id’] ,level = 3,拼接一个新的节点数据new_data,插入数据,插入成功,再将返回的id更新到new_data中

    编写代码

    1. node_text = self.m_nodeName.GetLineText(0)
    2. new_data = {}
    3. new_data['tree_data'] = node_text
    4. new_data['parent_id'] = self.data['id']
    5. new_data['level'] = 3
    6. reslut = sqlt.insert_treeNode_data(new_data)
    7. if reslut is False: return '插入数据失败'
    8. new_data['id'] = reslut[1]

    c、将new_data传给newWindow,让其展示出来

    先在NewWindow类中添加add_new_node函数,编写代码

    1.  def add_new_node(self, new_data, parent_item):
    2.         '''
    3.         在树上添加三级节点
    4.         :param new_data: 新节点数据
    5.         :param parent_item: 父节点对象
    6.         :return:
    7.         '''
    8.         self.m_nodetree.AppendItem(parent_item, new_data['tree_node'], data=new_data)

    上面代码就将new_data添加到parent_item中去

    再在NewNode类中的add_new_node中添加代码

    self.GetParent().add_new_node(new_data, self.item)

    self.Show(False)

    上面第一个框第一行代码是将获取初始化的parent对象,也就是NewWindow的对象,然后调add_new_node函数,传入new_data与父节点item,在树上展示新节点

    第二行是隐藏对话框,它的工作已经完成,须要隐藏起来

    第二个框是对话框确认按钮里调用自身的add_new_node函数,新增节点

    步骤五:运行,测试

    在2022-09-15节点下,添加‘湖广两地’

    查看结果,‘2022-09-15’节点下多了‘湖广两地’节点

    新增功能完成了,接下来便是修改功能了

    三、修改

    修改的框架代码在新增中已经添加差不了我,只需要在NewNode类中增加一个change_node,用来修改数据与调用NewWindow里的修改节点函数

    步骤1、添加修改函数

    回忆一下,前面我们实现了,NewWindow类中修改对话框的打开

    NewNode类中设置打开数据时,修改的代码,

    NewNode类中 确认按钮的响应函数的修改类型判断代码

    接下来在NewNode类中添加一个change_node方法,

    获取编辑框文字,将文件修改到data[‘tree_node’],然后修改到数据库中,编写代码        

    1. def change_node(self):
    2.       node_text = self.m_nodeName.GetLineText(0)
    3.       self.data['tree_node'] = node_text
    4.       if(sqlt.update_treeNode_data(self.data)) is False:
    5.           return '更新节点失败'

    步骤2、将data修改到节点中

    在NewWindows添加change_name函数,在其中编写修改节点文字与数据的代码    

    1. def change_node(self, data, item):
    2.       '''
    3.       修改节点
    4.       :param data: 节点数据修改后
    5.       :param item: 修改节点对象
    6.       :return:
    7.       '''
    8.       self.m_nodetree.SetItemText(item, data['tree_node'])
    9.       self.m_nodetree.SetItemData(item, data)

     然后在NewNode的change_node添加修改节点的代码,隐藏对话框的代码

    在确认按钮响应函数的修改判断下添加调chanege_node函数的代码

    步骤3、运行与测试

    选择‘湖广两地’修改变‘三湘四水’

    成功展示如下

    修改功能编写完成

    四、删除

    步骤1:添加删除代码

    删除,不需要什么代码,在NewWindow类中的删除菜单响应函数On_del_node中添加逻辑代码

    1)先获取节点,判断有没有子节点,无可删,有不可删除

    2)根节点不可删除

    3)删除节点数据,树节点展示移除

    步骤2:运行,测试

    根目录删除,这里它有子节点,子节点判断在前,所以打印子节点提示

    二级目录下有目录删除

    三级目录删除

    将三级目录全删除,再删除二级目录

    再删除根目录

    本章完,下一章节编写文章内容的增删改查

    全文代码下载地址:

    wxFormBuilder+wxPyton日记本小工具(完整版)-Python文档类资源-CSDN下载

  • 相关阅读:
    SAP 输出管理:生成自定义发票文件
    netty系列之:Bootstrap,ServerBootstrap和netty中的实现
    若依vue中字典Dict插件的研究
    导出Excel的技术分享-综合篇
    25-python面向对象版学员管理系统
    服务器托管和租用如何选择?
    STL初识
    java中泛型的理解
    VsCode预览Geojson数据
    GD32F103 硬件SPI通信
  • 原文地址:https://blog.csdn.net/weixin_40331132/article/details/127042746