欢迎回到我们的 《零基础:100个小案例玩转Python软件开发!》 系列!在第一课,我们实现了证件照换背景,相信大家已经感受到了PyMe的魅力。
今天,我们要直面一个更普遍的场景——数据录入。
想象一下:
- 财务同事每天要从上百张PDF发票里,把金额、日期、发票号一个个敲进Excel。
- 运维人员需要将服务器日志中的关键报错信息,手动整理到工单系统。
- 电商运营需要把商品图片、描述、价格从供应商的Word文档里,复制粘贴到网店后台。
这些工作重复、繁琐、反人性,并且极易出错。找人?成本高。自己干?浪费生命。
上节课我们写的是“一次性”脚本,而今天,我们的目标更高——我们要开发一个可重复使用、甚至能分享给同事的“数据录入工具”! 这将是你从“脚本小子”迈向“工具开发者”的关键一步。
1. 场景具象化
假设我们是某图书公司的管理员,每天会收到大量新书信息的邮件。邮件正文是结构化文本,如下:
书名:《图形引擎开发入门》作者:卞安ISBN:978-7-121-49592-2定价:138.00元出版社:电子工业出版社
我们的任务是把这些信息,录入到公司统一的图书管理软件中。这个软件界面草图大概长这样:
编辑
哈哈,想不到吧,这个界面还是挺有意思的,上面作为录入区域、包括了一些输入框和按钮,在右边还支持通过拍照或提交图片上传封面图,填写完信息后,可以点击”添加“按钮,可以将信息保存到到下方的列表中,选中列表行时,对应信息会在上方输入框显示,如果需要修改,则修改后点击”保存“按钮即可将数据更新。
2. 智能改造:通过文字识别来提升效率。
现在已经是AI时代,如果能通过拍照或提交封面图让大模型识别出书的信息,这样就能更快的录入信息,会使小伙伴们的工作效率大大提升!我们将在下一节中尝试加入摄像头拍照和上传封面图来进行图书信息识别。
3. 分步实现:打造你的专属录入助理。
(1)创建界面
首先,我们先启动PyMe(确保从www.py-me.com下载版本1.5.4.6并解压完成)。
编辑
创建一个”图书数据录入“项目,然后我们来按照上面的草图进行界面制作。首先将Form_1拖拽到合适大小,然后在右边的属性栏里将”布局“属性改为”打包排包“,所谓”打包排包“就是pack布局,它能自适应窗体的空间进行填充摆放。我们将Form_1设为”打包排布“后,从左边的控件工具条拖动一个”容器“控件Frame放置到Form_1中,创建出Frame_1,这时在正下方会出现一个布局设置工具条,我们在布局方式的下拉列表框选择”打包排布“,停靠选择”上“,填充选择”横向“,高度填300,经过这样的设置后,Frame_1将会自动的贴紧Form_1的上方,然后横向扩展填充,这样做的好处是不管Form_1窗口大小如何变化,Frame_1都能自动扩展,保持横向填充并高度不变。
编辑
然后我们再从左边控件工具条拖动一个ListView控件到Frame_1下方,在布局设置工具条中也选择”打包排布“,停靠选择”下“,填充选择”四周“。这时我们可以看到,ListView_1会自动填充Form_1的余下空间。
现在我们需要在容器控件Frame_1中放置其它的控件来制作输入区域,相信大家很快就能通过拖动Label。Entry、Button、LabelButton、Canvas来完成这些工作,只是要注意当弹出提示是否将控件作为容器控件Frame_1的子控件时,记得选择”是“就可以了。
编辑
这里我们使用LabelButton来表现”添加“和“保存”按钮,而通过设置Button的背景图片来表现“摄像头“和”拍照“两个按钮。很快就可以实现如下界面了。
编辑
(2)创建数据库
既然是数据录入,自然少不了数据库的支持,这里我们在下方的文件资源栏中用鼠标右键单击,在弹出菜单中选择”新建SQLite数据库“菜单项,在弹出的输入框里填写”Book“,就可以创建出一个Book数据库了。
编辑
双击数据库文件,会弹出编辑数据库的对话框,这个对话框可以方便的帮助我们处理数据库的数据表创建管理,并支持通过SQL进行数据的增删查改。我们可以在左边来的“数据表和字段”树列表中用鼠标右键单击,在弹出菜单中选择“创建数据表”来建加一个Book数据表。
编辑
创建数据表时,PyMe会默认创建一个唯一自增的id字段,然后我们可以选择Book表项,用鼠标右键单击为其增加字段Name、Author、ISBN、Publisher以用来记录书名、作者、ISBN号以及出版社,对于封面图片,我们倒是不一定非得存到数据库中,因为是个本地软件嘛,上传封面图片时,将图片保存为以id为文件名就可以很方便的找到啦~
编辑
如果我们需要一些测试数据,也可以直接在右边SQL语句旁边选择“添加一条记录”操作,在下方的SQL语句框里填写正确的SQL并运行,就可以看到右下方的数据记录列表中会显示出完成操作后的查询结果啦,是不是很方便?再也不用摸黑干活啦~!
编辑
(3)实现逻辑处理
有了界面、也有了数据库,下面我们还需要一个纽带来帮助我们将控件与数据库连接起来。这个纽带就是数据库组件。
在左边工具条选择“组件”页,找到数据库组件并拖动到界面上,然后在其右边的属性栏中选择使用SQLite数据库,双击“数据文件或内存”项,在弹出列表中选择filename,也就是“文件名”模式,然后选中我们的Book.db文件,就将数据库组件与数据库进行绑定了。
编辑
3.1 添加数据
在“添加”按钮上用鼠标右键单击,选中弹出菜单的“事件响应”菜单项,在弹出的事件响应编辑区对话框中选择Command事件,然后点击右下方的“调用数据库操作”。
编辑
这时我们就可以看到由Command=>调用数据库操作的对话框了,我们将提交类型改为“增加记录”,然后在数据字段名称列表中逐一选中对应字段,并在右边的“当前表单输入控件”中选择对应的Entry控件后点击“绑定控件“,这么做就可以将Entry控件填写的数据插入到对应字段中了。
编辑
点击”确定“按钮,这时PyMe会进入到代码编辑区并自动填写好相应的代码,是不是很酷!
编辑
在代码编辑器里用鼠标右键单击,选中菜单项”返回界面设计视图“,保存后就可以返回到界面设计器中,我们再为”保存“按钮做同样的操作。只是这次的数据库操作的提交类型要改为”修改记录”,并设置条件索引id = 控件数值类型,选结果为ListView_1的行变量A。
编辑
为什么要这么做呢?因为我们希望能在选中ListView_1的指定行数据进行修改,PyMe中的ListView控件提供了四个行变量A、B、C、D供我们使用,我们在PyMe的数据表默认会创建主键id字段,所以我们只要在填充ListView_1的数据时,为每一行变量A中保存数据记录的id值就可以了。
下面我们来为ListView绑定数据记录,首先在ListView_1上右键单击,在弹出菜单中选择“编辑列信息”,然后按照我们的录入字段对原有的列标题进行修改,修改列名称和宽度后点击“保存修改”即可。
编辑
然后我们在空白区右键单击(确保版本更新至1.5.4.6+),在弹出菜单中选择“事件响应”,在这里选择的“变量绑定”和“事件响应”都是对Form_1的设置。
编辑
在弹出的事件响应处理编辑区对话框中,选择Form_1加载完成后调用的Load事件,然后在右边选择“调用数据库操作”。
编辑
这时会进入到Load=>调用数据库操作对话框,在这里我们保持提交类型为“显示记录”,然后在左边的数据字段名称列表中选择Name,在右边的当前表单输入控件中选择“ListView_1”,列名称选择“书名”,点击“绑定控件”,然后依次为其它字段绑定对应的列名称,最后再设置排序索引为id。这里要注意的是:在ListView中没有与id对应的列,但我们需要将字段id与行变量-A来绑定。
编辑
点击“确定”按钮后,会进入到代码编辑器中,在Form_1_onLoad这个函数中自动生成加载数据到ListView_1的代码,这种可视化编辑即可完成代码生成的方式,可以极大地方便我们对数据库的操作。
编辑
点击右上角的运行按钮,这时可以看到窗体在弹出时ListView_1自动就加载了对应的数据了。
编辑
我们在输入数据并点击“添加”按钮后,这时会执行插入数据,如果操作成功则会弹出提示。
编辑
插入操作虽然成功,但ListView_1并不会正确显示添加的数据,这是因为我们在完成添加数据操作时,没有刷新ListView_1数据,所以我们双击“添加”按钮进入代码编辑器,然后在弹出操作成功提示后,调用Form_1_onLoad函数进行刷新。当然,最好是将这部分代码单独放置在一个函数UpdateListView中,然后在Form_1_onLoad和当前按钮点击时调用比较清晰易懂。
编辑
3.2 保存数据
下面我们希望选择对应的ListView行时,能将数据显示在输入框里,我们手动修改后,点击“保存”按钮即可对相应数据进行更新。那么我们也要为”保存“按钮来增加Command事件调用数据库操作,在这里要注意首先将”提交类型“选择为”修改记录“,然后将四个Entry绑定到对应的字段,这样操作会将Entry的值作为修改记录时的各字段值,最后要注意,条件索引需要让当前记录的id = 控件ListView_1的行变行A,点击”确定“按钮后就完成这部分的数据库操作处理了。
编辑
接下来,我们还需要在ListView_1被鼠标点击时,将相应行的数据显示在输入框中,那么我们在ListView_1上用鼠标右键单击,选择”事件响应“菜单项,调出事件响应处理编辑对话框,左边选中单元格单点事件CellClicked,右边点击”编辑函数代码“进入代码编辑器。
编辑
在函数中调用Fun函数库中的GetRowTextList函数,参数行索引设置为当前事件绑定函数的参数rowIndex即可获取当前行的所有单元格的值,然后设置到四个Entry就可以了。
#ListView 'ListView_1's CellClicked Event :
def ListView_1_onCellClicked(uiName,widgetName,rowIndex,columnIndex,threadings=0):
RowTextList = Fun.GetRowTextList(界面名称=uiName,控件名称='ListView_1',行索引=rowIndex)
Fun.SetText(界面名称=uiName,控件名称='Entry_1',字符串文本=RowTextList[0])
Fun.SetText(界面名称=uiName,控件名称='Entry_2',字符串文本=RowTextList[1])
Fun.SetText(界面名称=uiName,控件名称='Entry_3',字符串文本=RowTextList[2])
Fun.SetText(界面名称=uiName,控件名称='Entry_4',字符串文本=RowTextList[3])
pass
编辑
这样关于数据库的手动操作基本都有了~
本节课主要讲述了数据库组件的操作,下节课我们将进入摄像头和上传图片来填写信息。相信经过这个案例的学习,小伙伴们一定会对PyMe的强大功能有更多掌握。有学不会或遇到问题的小伙伴,欢迎在PyMe群里反馈,我们下节课再见!