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

8 篇文章 17 订阅
订阅专栏

目录

 

前言

一、代码目录层级

二、数据库

三、数据表设计

四、展示数据


前言

上一章节已经介绍了如何将程序主窗口设计好生成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:
            #执行sql
            sql = '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 result
        except 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.lastrowid
            return True, id
        except Exception as e:
            return False


    def 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 True
        except:
            return False


    def 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 True
        except:
            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 True
        except:
            return False

    def 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 True
        except:
            return False


    def 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 True
        except:
            return False


sqlt = 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

Form Builder的贴图教程,自己做的
12-02
建立一个简单的Form,利用 Dev Suite 10g. 表是最常见的emp和dept 一共两个PPT
wxFormBuilder + wxPython 工具开发第一章-拖出日记本图形界面
weixin_40331132的博客
09-13 4325
wxFormBuilder拖出界面,Python代码调试,运行拖出来的客户端工具
wxFormBuilder 安装和配置指南
最新发布
gitblog_09585的博客
09-13 472
wxFormBuilder 安装和配置指南 wxFormBuilder A wxWidgets GUI Builder 项目地址: https://gitcode.com/gh_mirrors/wx/wxFormBuilder ...
Step by Step使用wxFormBuilder设计用户图形界面并集成入PyCharm
yardwood的博客
05-27 5603
介绍了如何使用wxFormbuilder一步步的制作一个简单的用户图形界面,并集成入Python IDE PyCharm的过程。
python借助wxFormBuilder工具搭建基础的GUI界面—wxFormBuilder工具使用介绍
Logintern09的博客
09-04 4554
使用wxFormBuilder 工具设计界面,python调用的模块是wxpython。以静态文本框TextCtrl为例,通过在网址搜索wx.TextCtrl,进入静态文本框TextCtrl介绍的界面,重点需要关注的是触发控件的事件,和控件的使用方法也就是控件常用的一些函数。
wxFormBuilder使用介绍
热门推荐
LMX的博客
03-22 1万+
wxFormBuilder介绍 wxFormBuilder是一个开源,跨平台的所见即所得的图形用户界面生成器,可以翻译wxWidget GUI设计成C++,Python,PHP,XRC格式。github项目地址 这个工具wxPython设计用户图形界面的过程可视化。通过简单的设计控件自动生成代码,大大的提升了生产效率。 wxFormBuilder界面介绍 wxFormBuilder使用流程 配置项目的参数 主窗口 配置主窗口参数 添加布局管理器 添加需要的组件 设置组件的属性和事件 总的来说就是添加一
2024年最新Python+wx.Python+wx.FormBuilder创建视图并且布局案例
weixin_42198508的博客
01-12 1676
上一期我们介绍了如何下载安装wxPythonwxFormBuilder
wxFormBuilder+wxPython+Python实现的简易计算器小项目代码
08-29
wxFormBuilder画出图形界面,生成wxPython代码 Python实现后台计算逻辑 代码层次分享简单 适合初用wxFormBuilder做客户端程序的朋友参考
wxFormBuilder+wxPyton日记本工具(完整版)
09-21
wxFormBuilder + wxPyton + Python + Sqlite实现本地日记本工具 当天新增当天yyyy-MM-dd格式目录 在日期目录下可新增日记或文章名称 文章编写完成后,保存在本地 文章的增删改查,目录增删除改查功能闭环
wxFormBuilder+wxPyton日记本工具图形界面代码(后端逻辑缺失)
08-29
wxFormBuilder画图形页面 详细做了整个框架的布局 菜单、树、编辑框控件 生成wxPython代码
wxPython-4.1.1-cp38-cp38-win_amd64.whl
12-01
由于官网难下,特分享出来,wxpython 适用于python38的版本 wxPython-4.1.1-cp38-cp38-win_amd64.whl
wxFormBuilder.7z 3.9 增加中文语言支持
06-15
wxFormBuilder 3.9 增加中文语言; 增加对 wxTreebook 和 wxToolbook 控件的支持;已添加版权说明文件
wxFormBuilder-开源
04-17
所有开发都移至GITHUB https://github.com/wxFormBuilder/wxFormBuilder wxFormBuilder-用于wxWidgets GUI设计的RAD工具
wxFormBuilder
04-16
wxPython库的可视化操作界面,很好的解决界面问题,帮你排忧解难
wxFormBuilder_v3.5.1可视化图形界面设计工具
11-06
可视化的界面设计工具wxFormBuilder是一个开源,跨平台的所见即所得的图形用户界面生成器,可以翻译wxWidget GUI设计成C++,Python和PHP或XML代码格式。
wxPython-4.1.1-cp37-cp37m-win_amd64.whl
12-24
wxPython-4.1.1-cp37-cp37m-win_amd64.whl 下载太慢了,上传个资源
Python GUI: wxpython wxFormBuilder
人不风流枉少年
01-18 1302
https://github.com/wxFormBuilder/wxFormBuilder/releases
使用 wxFormBuilder 创建登录界面
Winfredzhang的博客
07-18 751
例如,可以将用户名标签的文本设置为 "用户名",并将密码标签的文本设置为 "密码"。wxFormBuilder 将生成包含登录界面代码的文件。您可以将这些文件包含到您的应用程序中以创建登录界面。如果用户名和密码正确,则可以显示成功消息或将用户定向到应用程序的主界面。最后,您需要编写事件处理程序来响应登录按钮的单击事件。在生成的代码中,找到处理按钮单击事件的函数。一旦您对登录界面的设计满意,就可以生成代码了。在 wxFormBuilder 的主窗口中,将。这将是登录界面的主面板。
wxPython剪贴板操作指南-数据对象与拖放
wxPython中,要将数据放入剪贴板,需要创建一个`wx.DataObject`的实例,这是一个特殊的类,它包含了描述数据格式的元数据。例如,如果你正在开发一个文字处理程序,你可能希望提供无格式文本或富文本格式供用户...
写文章

热门文章

  • 新版selenium4.0 + Python使用详解 29014
  • Python 从无到有搭建WebUI自动化测试框架 28944
  • Python从无到有搭建接口(API)自动化测试框架 14235
  • PyCharm无法import已有的库,解决方法 6310
  • code 128 ....command git --no-replace-objects ls-remote ssh://git@github.com/nhn/raphael.git解决方案 5999

分类专栏

  • 自动化测试 20篇
  • wxPython 8篇
  • 性能 3篇
  • 测试须知 3篇
  • django 4篇
  • python 20篇
  • 学习中 23篇
  • 心得 10篇

最新评论

  • Windows10环境下Python 开发环境搭建

    hxsln11: 新手友好级

  • Python从无到有搭建接口(API)自动化测试框架

    魂尾ac: 用csdn的私聊我吧,这个回复我很少看,也不能截图,我需要你代码运行的截图

  • Python从无到有搭建接口(API)自动化测试框架

    魂尾ac: weixin_40331132 魂尾ac 作者 1 秒前 回复 点赞 用csdn的私聊我吧,这个回复我很少看,也不能截图,我需要你代码运行的截图

  • Python从无到有搭建接口(API)自动化测试框架

    晨丶.: 这个怎么解决啊,大佬

  • Python从无到有搭建接口(API)自动化测试框架

    晨丶.: 大佬,你这个框架在测试的时候,如果成功跟你展示的结果是相同的,但是失败的话,testCase.py会报错' code = str(response.status_code) str' object has no attribute 'status_code'

大家在看

  • Python输出2进制8位数排列组合彩色图像程序代码
  • Python输出逆序排列字符串程序代码
  • 推荐一款功能强大的智能语言交互软件:豆包桌面客户端
  • string类,难吗?这不简简单单! 641
  • ADC在STM32F1系列的使用详解 371

最新文章

  • 软件测试工程师进阶时需要知道的一些linux知识
  • Python从无到有搭建WebUI自动化测试框架之上传附件用例编写
  • Python 从无到有搭建WebUI自动化测试框架之测试报告优化
2023年7篇
2022年23篇
2021年7篇
2020年25篇
2019年8篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魂尾ac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家威海城市玻璃钢雕塑江苏商业商场美陈深圳玻璃钢花盆报价常见玻璃钢花盆研究沧州玻璃钢商场美陈飞翔玻璃钢雕塑厂家玻璃钢花盆厂家上海玻璃钢大型仿铜雕塑安徽公园玻璃钢雕塑优势深圳美陈做得好的商场淮安玻璃钢卡通雕塑厂家苏州主题商场美陈杭州秋季商场美陈蒙自市玻璃钢雕塑订制浙江多彩玻璃钢雕塑批发马鞍山大型玻璃钢雕塑多少钱宣城大型户外玻璃钢雕塑玻璃钢雕塑公司哪家专业石河子气球商场美陈玻璃钢海洋雕塑报价单六安户外玻璃钢雕塑黄冈卡通玻璃钢雕塑定做商丘市玻璃钢雕塑武威动物玻璃钢雕塑制作玻璃钢雕塑动物彩绘马玻璃钢雕塑哪里的最好楚雄市玻璃钢雕塑设计厂家玻璃钢动物雕塑园林小品昭通玻璃钢雕塑厂家公园主题玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化