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

发布于:2022-12-07 ⋅ 阅读:(392) ⋅ 点赞:(0)

目录

前言

一、添加树右击菜单

二、新增

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里添加弹出菜单代码   

 def on_pop_right_menu(self, event):
       #弹出菜单
       self.PopupMenu(self.right_click_menu)



 def On_add_node(self, event):
       event.Skip()



 def On_change_node(self, event):
       event.Skip()



 def On_del_node(self, event):
       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类,按钮的响应函数也覆盖一下
from NodeBook.template.newNodedlg import NewNodeDlg


class NewNode(NewNodeDlg):

    # Virtual event handlers, overide them in your derived class
    def on_confirm(self, event):

        event.Skip()

        print('确认')

    def on_cancel(self, event):

        event.Skip()

        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函数里会传入这三种数据

    def __init__(self, parent):

        super().__init__(parent)
        #数据
        self.data = {}

        #操作类型,0新增/1修改
        self.type = 0

        #父节点或源节点
        self.item = None





    def set_open_data(self, type, data,item):

        '''
        show对话前设置相关数据
        :param type: 0为新增,1为修改
        :param data: 新增时,data为父节点数据,
        :param item: 父节点或源节点对象
        :return:
        '''

        if type == 0:
            self.SetTitle('新增文章节点')
        else:
            self.SetTitle('修改文章节点')
        self.type = type
        self.data = data
        self.item = item

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

新增: 

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

修改: 

 # 获取当前选择的节点对象
  tree_item = self.m_nodetree.GetSelection()

  # 获取当前节点的data
  data = self.m_nodetree.GetItemData(tree_item)
  self.andlg.set_open_data(1, data, tree_item)
  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中

编写代码

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

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

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

 def add_new_node(self, new_data, parent_item):
        '''
        在树上添加三级节点
        :param new_data: 新节点数据
        :param parent_item: 父节点对象
        :return:
        '''
        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’],然后修改到数据库中,编写代码        

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

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

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

def change_node(self, data, item):

      '''
      修改节点
      :param data: 节点数据修改后
      :param item: 修改节点对象
      :return:
      '''
      self.m_nodetree.SetItemText(item, data['tree_node'])
      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下载

本文含有隐藏内容,请 开通VIP 后查看