目录

前言

一、代码目录层级

二、数据库

三、数据表设计

四、展示数据


前言

上一章节已经介绍了如何将程序主窗口设计好生成python代码,运行成功的展示了窗体。

上一章内容地址:

wxFormBuilder + Python 工具开发第一章-拖出日记本图形界面_魂尾ac的博客-CSDN博客

这一章节将会介绍如何将代码目录架构定好,实现树与文章从数据库展示到前端窗体的内容

功能与内容:

数据库选型

设计数据表

实现数据IO

展示树节点

切换展示文章

实现后基本功能测试

本节最终效果图

文中   wxFormBuilder   均简化为  wxF  代替

一、代码目录层级

代码目录设计为

NodeBook

manage

template

NodeBook为日记本项目目录,template为wxF生成的图形界面代码目录,manage是一些继承template里图界面代码类的类文件、数据库管理代码文件、以及其它逻辑代码的目录,后面还会有一个目录存放本地数据库

1、新增名为template的pkg目录,将图形界面代码移入

2、新增名为manage的pkg目录,在其下新增newWindow.py文件,将runMain里的MainFrame派生类移入其中

PS:注释MainFrame导入头会变成:from NodeBook.template.noname import MainFrame

3、在runMain.py中去掉MainFrame派生类的代码,添加NewWindow的导入头:

from NodeBook.manage.newWindow import NewWindow

runMain.py始终是项目代码运行入口。

4、运行,检查代码是否正常

二、数据库

小工具要使用的数据应该是一个跟着工具走,本地的,开源的,Sqlite刚好满足这样一个需求;许多开发手机app小工具的都使用它作为数据库。

1、Sqlite下载

在https://www.sqlite.org/download.html网站下载

解压sqlite-tools-win32-x86-3390200.zip

2、建库

打开sqlite.exe文件

输入命令:.open notebook.db 生成数据库

3、建表

使用navicat连接notebook.db(navicat怎么连sqlite, 百度学习一下)

建一个user表,表里有accout、password字段,建表SQL如下:
create table user(

id INTEGER primary key autoincrement,

account VARCHAR not null,

password VARCHAR not null

)

在user表里添加几条数据供python调试

4、python连接notebook.db库

1)在代码目录新增一个database目录,将notebook.db 拷贝到database目录下。

2)manage目录下新增一个sqliteio.py文件,

3)先获取一下notebook.db的绝对路径,编写代码如下

import os
import sqlite3#获取上一层目录的绝对路径
par_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取database绝对路径
dpath = os.path.join(par_path, 'database')#获取notebook.db的绝对路径
nbpath = os.path.join(dpath, 'notebook.db')print(nbpath)

执行结果:

4)连接数据,读写user数据,编写代码如下

#连接数据
conn = sqlite3.connect(nbpath)#获取游标
cur = conn.cursor()#执行查询SQL语句
cur.execute('select * from user;')#遍历查出的数据,fetchall()即获取查出所有数据的列表
for row in cur.fetchall():print(row)#执行插入数据
cur.execute('insert into user(account, password) values("xiaotian","qwert1234")')
print('-------插入数据后---- 重新查询------- ')#重新查询
cur.execute('select * from user;')#遍历查出的数据,fetchall()即获取查出所有数据的列表
for row in cur.fetchall():print(row)#关闭游标、关闭数据库连接
cur.close()
conn.close()

执行结果

Sqlite基础操作暂时告一段落,后面开始做Notebook数据库开的正式内容

三、数据表设计

1、表设计

日记本,日期与名称,做一个树节点表,有id,父id,节点名称等等;再做一个文章表,有树节点外键,文章标题,文章内容等等。

树表:treenodes

字段

类型

长度

可否为空

描述

id

主键自增

tree_note

char

200

节点名称

parent_id

Int

父节点id

Is_delete

int

删除标识,默认为0未删除, 1为删除

create_time

Data_time

创建时间

updata_time

Data_time

更新时间

文章表:articles

字段

类型

长度

可否为空

描述

id

主键自增

tree_id

treenodes外键

name

vchar

200

文章名称

content

text

文章内容

Is_delete

int

删除标识,默认为0未删除, 1为删除

create_time

Data_time

创建时间

Updata_time

Data_time

更新时间

2、创建表脚本

-- 创建树表
create table treenodes(
id INTEGER primary key autoincrement,
tree_note  CHAR(200) not null,
parent_id  INT,
is_delete  INT default 0,
create_time DATETIME not null default current_timestamp,
updata_time DATETIME not null default current_timestamp
)-- 创建文件内容表
create table articles(
id INTEGER primary key autoincrement,
tree_id INTEGER,
name CHAR(200) not null,
content TEXT,
is_delete INT default 0,
create_time DATETIME not null default current_timestamp,
updata_time DATETIME not null default current_timestamp,
FOREIGN KEY (tree_id)  REFERENCES treenodes(id) on delete cascade on update cascade
)

3、数据库封装

1)新增类SqliteIo的类,初始化数据连接,析造数据

代码如下:

class SqliteIo(object):def __init__(self):'''构造函数初始化数据库连接'''self.conn = sqlite3.connect(nbpath)self.cur = self.conn.cursor()def __del__(self):'''析造函数关闭游标与数据库连接:return:'''self.cur.close()self.conn.close()

2)treenotes增删改查

代码如下:

 def get_treeNode_lst(self):'''获取treenodes所有未删除的数据:return:list: [{},{},{}]表数据列表'''try:#执行sqlsql = 'select * from treenodes where is_delete = 0'self.cur.execute(sql)#用推导式 获取表头字段名title = tuple(item[0] for item in self.cur.description)#获取所有的数据rows = self.cur.fetchall()#用推导式 将表头与数据拼装成一个字典列表result = [dict(zip(title, item)) for item in rows]return resultexcept Exception as e:return []def insert_treeNode_data(self, data):'''新增节点:param data: 节点数据:return: bool 成功与否'''try:sql = '''insert into treenodes(tree_note, parent_id, level) values('{}', {}, {})'''.format(data['tree_node'], data['parent_id'], data['level'])self.cur.execute(sql)self.conn.commit()id = self.cur.lastrowidreturn True, idexcept Exception as e:return Falsedef del_treeNode_data(self, id):'''删除节点(逻辑删):param id: 节点id:return: bool 成功与否'''try:sql = 'update treenodes set is_delete = 1 where id = {}'.format(str(id))self.cur.execute(sql)self.conn.commit()return Trueexcept:return Falsedef update_treeNode_data(self, data):'''更新节点名称:param data: 节点数据 dict:return:  bool 成功与否'''try:sql = '''update treenodes set tree_note = '{}' where id = {}'''.format(data['tree_node'], data['id'])self.cur.execute(sql)self.conn.commit()return Trueexcept:return False

3)articles增删改查

    def get_articles(self, tree_node_id):'''通过树id找文章:param tree_node_id: 树id:return: dict,返回文章内容'''try:sql = '''select * from articles where tree_id = {}'''.format(tree_node_id)# 用推导式 获取表头字段名self.cur.execute(sql)title = (item[0] for item in self.cur.description)#获取数据item = self.cur.fetchone()return dict(zip(title, item))except:return {}def insert_articles(self, data):'''新增文章:param data: 文章数据:return: bool 成功与否'''try:sql = '''insert into articles(tree_id, name) values({}, '{}')'''.format(data['tree_id'], data['name'])self.cur.execute(sql)self.conn.commit()return Trueexcept:return Falsedef updata_articles(self, data):'''更新文章:param data::return: bool 成功与否'''try:sql = '''update articles set name='{}', content='{}' where id = {}'''.format(data['name'], data['content'], data['id'])self.cur.execute(sql)self.conn.commit()return Trueexcept:return Falsedef del_articles(self, id):'''删除文章(逻辑删除):param id: 文章id:return: bool 成功与否'''try:sql = '''update articles set is_delete = 1 where id = {}'''.format(str(id))self.cur.execute(sql)self.conn.commit()return Trueexcept:return Falsesqlt = SqliteIo()

数据库代码封闭完毕,中间的细节,慢慢会补上

后面的sqlt是将数据库读取类单例化

四、展示数据

1、在数据库添加数据

添加四个树节点,根目录,两个日期(二级)目录,一个文章(三级目录)目录

parent_id决定父节点,id与parent_id构成树节点的级联关系

添加一篇文章,对tree_id=4

tree_id,表示这篇文章属于哪个树节点,后期效果,点击某个三级节点,展示对应文章内容

2、展示树节点

首先呢,在newWindow.py里导入sqlt数据库操作对象

编写一个list_to_tree的递归函数,实现数据格式化

树节点格式

[

{

Id:1,

....

Children:[{子节点}]

}

]

在NewWindow里添加一个方法get_tree_node(),用例sqlt调用函数get_treeNode_lst()获取数据库里的数据,然后调用list_to_tree()函数将获取的数据转换成树格式

在构造函数里新增一个m_tree的变量,调用get_tree_node函数,将返回赋值给m_tree

将树展示在窗体中

编写函数set_tree(),在其中递归将节点设置到self.my_nodetree中(my_nodetree是窗体树的对象)

在构造函数init中调用set_tree(),传入self.m_tree,将m_tree的树数据展示出来

运行runMain.py文件

窗体中的树展示的节点是按照treenodes里的数据逻辑形成的,‘2022-9-6’、‘2022-9-7’两个节点的parent_id是1,也就是‘根目录’,‘那年夏天’的parent_id是2,也就是‘2022-9-6’

  1. 展示文章

展示文章应该是点击文章标题展示对应文章,从选择的节点中获取data,在data找到id,通过id在articles的tree_id中找到文章,展示在编辑框中

(1)切换树节点响应事件函数实现

在wxF中选择m_nodetree:wxTreeCtrl添加OnLetfDown的事件,on_change_rticles。

再将生成的代码复制过来,如果熟悉了,可以局部复制,免得再去修改兼容代码

在newWindow.py覆盖这个事件函数,编写选择节点的数据打印一下

运行runMain.py,点击树节点来回切换,看控制台打印

好,切换树节点功能实现

3、展示文章

在响应函数里添加获取文章数据并展示在编辑框中的代码,编辑框的对象是m_textEdit

运行runMain.py节点,点击‘那年夏天’,可以看到右边的编辑框,可以展示对应的文章内容了

此时我们在数据里多添加一些文章,看看切换是否有效果

本章完成,下一章讲述树节点数据的增改删的开发

本章代码:

https://download.csdn.net/download/weixin_40331132/86616745

wxFormBuilder + wxPython 工具开发第二章-日记本工具数据连接与展示相关推荐

  1. 【微信开发第二章】SpringBoot实现微信公众号普通消息和模板消息回复

    前言 在进行微信公众号业务开发的时候,微信公众号的消息回复是非常重要的一环,而微信公众号消息回复分为:普通消息自动回复和模板消息回复.该篇文章会先使用微信测试工具过一遍流程,再使用代码进行实现,并且每 ...

  2. 第二章:大数据文件系统之HDFS-CSDN就业班-专题视频课程

    第二章:大数据文件系统之HDFS-160人已学习 课程介绍         1.HDFS原理与架构说明 2.HDFS的NameNode和DataNode 3.HDFS缓存机制(Cache) 4.HDF ...

  3. wxFormBuilder + wxPython 工具开发第四章-日记本工具文章内容增改删以及打包

    目录 前言 一.文章新增 二.文章删除 三.文章修改 四.Ctrl+S快捷键的响应 五.增加提示 六.打包exe 前言 上一章讲述对日记本树目录的节点实现增.改.删的功能步骤 链接:wxFormBui ...

  4. pyqt5 制作壁纸切换工具实例 第二章

    pyqt5 制作壁纸切换工具实例 第一章 https://blog.csdn.net/mtl1994/article/details/118020546 提示:写完文章后,目录可以自动生成,如何生成可 ...

  5. Node交互式命令行工具开发——自动化文档工具

    转载自:小磊 https://segmentfault.com/a/1190000039749423 nodejs开发命令行工具,流程相对简单,但一套完整的命令行程序开发流程下来,还是需要下点功夫,网 ...

  6. 第二章 DateTime工具类

    项目中经常需要将DateTime转化成各种格式的String类型,或将各种类型的String转为DateTime类型. 本文提供一个DateTime与String的转换工具类: import org. ...

  7. 工具开发|键盘记录工具原理及代码实现

    作者: Beard林 免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责. 0x01 对于键盘记录简述 键盘记录一般用在后渗透中,以此方法寻求扩大战果.有些c2工具集成了这个功能, ...

  8. IPHONE游戏开发 第二章 游戏引擎剖析

    游戏引擎剖析 为了解决"如何在IPHONE上创建一个游戏"这个大问题,我们需要首先解决诸如"如何显示图像"与"如何播放声音"等一系列小问题. ...

  9. 路飞学城python开发ftp_路飞学城-Python开发-第二章

    '''数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家': ...

最新文章

  1. C/C++语言参数传递----函数/方法 参数的指针引用传递
  2. qtdesigner 组件全吗_百度营销工具有哪些?带你了解百度全链路营销
  3. ASP.NET MVC 重点教程一周年版 第九回 HtmlHelper
  4. LInux查看文件内容
  5. php redis 扩展 常用方法
  6. Django前后端增删改查
  7. 防止Visual C++应用程序缓冲区溢出
  8. 编程开源_立即注册免费的在线开源编程课程
  9. 【Elasticsearch】es 报错 no such index index_not_found_exception
  10. 从头开始复习css之选择器(中)
  11. [H5-Compress-Image]利用canvas实现 javascript 图片压缩处理_基于requirejs模块化的代码实现...
  12. vs的windows应用程序上的鼠标为什么一直是加载状态?_了解 JavaScript 应用程序中的内存泄漏...
  13. Java常见设计模式总结
  14. Obsidian V0.14.6版本下实时渲染总是出Bug,时常渲染不出来
  15. dell N4050声卡驱动安装后仍然没有声音,改装XP完美驱动IDT声卡!实测可用!
  16. PMP第十章:项目沟通管理
  17. 人脸识别主要算法原理
  18. WHAT、HOW、WHY
  19. 不良意志品质及其克服
  20. oracle怎么绑定vue,Oracle AutoVue 安装与配置教程,oracleautovue

热门文章

  1. MatLab中多项式
  2. wxPython中文教程入门实例
  3. Win7/Win10双系统安装方法图文教程
  4. svn+ssh服务器与客户端配置方法
  5. final 关键字:用来修饰类,方法,成员变量,局部变量
  6. 高效删除Oracle数据库中重复数据,并保留最新一条的方法
  7. Datastage性能优化
  8. apple id 已被停用?我的解决之道
  9. 导航系统中的惯性技术
  10. SDUT-2933-人活着系列之Streetlights (Kruskal)