1.图形界面
面向客户的工具软件通常需要响应的图形界面,由于对Qt较为熟悉,因此使用PyQ来搭建
信号与槽模式
区别于matlab中采用的回调函数形式,信号槽模型能够更好的去除耦合性
- 在QtDesigner的信号槽模型中新建信号与对应的槽函数,一般用于控件相关的动作
- 自定义:信号发射可以是任何数据类型,包括字典。
定义:process_sig = QtCore.pyqtSignal(int)
连接:self.thread.process_sig.connect(self.update_process)
发出信号:self.process_sig.emit(index)
多线程
由于dwg文件解析是一个相对耗时的任务,在批量处理时尤其如此,因此在界面中增加进度条。同时带来新的问题——耗时任务进行时界面处于卡死状态,无法操作,进度条也不能正常显示,因此需要分出界面进程与处理进程。
python多线程的库例如threading,由于是结合Qt使用,因此选择Qthread。
- 继承QtCore.Qthread,重写run对象函数为任务密集型,在主程序中利用start启动,可以在run结束之后多次反复启动。
- 在Qt4.4及以以后,Qthread不再是抽象类。因此可以继承QObject实现任务类,并使用MovetoThread转移到新建的Qthread类型的线程中,这样所有的槽函数都是运行在新建线程中的。
2 文件解析
编码
所有语言都可以认为是信息的编码规则的,编程语言也是。而所谓的编码方式都可以认为是字符码到字节码的映射关系。
Unicode与utf8的关系
Unicode为世界上所有语言的字符都分配了一个序号,由于字符的数量很多,这个序号需要使用双字节16位。
如果直接将这个序号作为字节码映射,必然造成大量空间浪费,不同字符的使用频率相差很大,使用频率较高的字符理应使用较短的编码。
utf8因此采用变长码的方式,兼顾了容量与效率,是python3的默认编码方式
python文字编码
python中有str与bytes两种类型,decode与encode分别用于正向与反向转换
在使用赋值符号"="创建字符串对象时,会自动调用encode函数
解析xml文件
- xml.etree.ElementTree: https://docs.python.org/2/library/xml.etree.elementtree.html 功能弱,特别向上回溯
lxml: https://lxml.de/(需要fq) 对xpath完全支持。
xpath
xpath表达式可以快速定位DOM树中的元素
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
轴名称 | 结果 |
---|---|
ancestor | 选取当前节点的所有先辈(父、祖父等)。 |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。 |
attribute | 选取当前节点的所有属性。 |
child | 选取当前节点的所有子元素。 |
descendant | 选取当前节点的所有后代元素(子、孙等)。 |
descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 |
following | 选取文档中当前节点的结束标签之后的所有节点。 |
namespace | 选取当前节点的所有命名空间节点。 |
parent | 选取当前节点的父节点。 |
preceding | 选取文档中当前节点的开始标签之前的所有节点。 |
preceding-sibling | 选取当前节点之前的所有同级节点。 |
self | 选取当前节点。 |
示例
.//tag[@att1='属性1' and text()='内置文本']/subtag
/bookstore/book[price>35]/title
/bookstore/book[position()<3] | //price
descendant::book #选取当前节点的所有 book 后代。
正则匹配
re: https://docs.python.org/zh-cn/3/library/re.html
替换 text = re.sub(re_str, text)
匹配 re.search(re_str, text).group(1) # group从1开始计数
3 软件打包
打包好的软件的存储空间占用自然是越小越好,利用pyinstaller打包的软件大小与包含的库息息相关。
例如,Pyqt库对应30M,pandas/numpy等科学运算库会占用比较大的空间,一般在60M左右。
有人指出使用pipenv虚拟环境打包的软件可以去除原生python环境中不需要的内容,经过测试确实能减小软件体积,但是差距不大(1M左右)。