Python工具软件开发

1.图形界面

面向客户的工具软件通常需要响应的图形界面,由于对Qt较为熟悉,因此使用PyQ来搭建

信号与槽模式

区别于matlab中采用的回调函数形式,信号槽模型能够更好的去除耦合性

  1. 在QtDesigner的信号槽模型中新建信号与对应的槽函数,一般用于控件相关的动作
  2. 自定义:信号发射可以是任何数据类型,包括字典。
定义:process_sig = QtCore.pyqtSignal(int)
连接:self.thread.process_sig.connect(self.update_process)
发出信号:self.process_sig.emit(index)

多线程

由于dwg文件解析是一个相对耗时的任务,在批量处理时尤其如此,因此在界面中增加进度条。同时带来新的问题——耗时任务进行时界面处于卡死状态,无法操作,进度条也不能正常显示,因此需要分出界面进程与处理进程。
python多线程的库例如threading,由于是结合Qt使用,因此选择Qthread。

  1. 继承QtCore.Qthread,重写run对象函数为任务密集型,在主程序中利用start启动,可以在run结束之后多次反复启动。
  2. 在Qt4.4及以以后,Qthread不再是抽象类。因此可以继承QObject实现任务类,并使用MovetoThread转移到新建的Qthread类型的线程中,这样所有的槽函数都是运行在新建线程中的。

2 文件解析

编码

所有语言都可以认为是信息的编码规则的,编程语言也是。而所谓的编码方式都可以认为是字符码到字节码的映射关系。

Unicode与utf8的关系

Unicode为世界上所有语言的字符都分配了一个序号,由于字符的数量很多,这个序号需要使用双字节16位。
如果直接将这个序号作为字节码映射,必然造成大量空间浪费,不同字符的使用频率相差很大,使用频率较高的字符理应使用较短的编码。
utf8因此采用变长码的方式,兼顾了容量与效率,是python3的默认编码方式

python文字编码

python中有str与bytes两种类型,decode与encode分别用于正向与反向转换
在使用赋值符号"="创建字符串对象时,会自动调用encode函数

解析xml文件

  1. xml.etree.ElementTree: https://docs.python.org/2/library/xml.etree.elementtree.html 功能弱,特别向上回溯
  2. 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左右)。

猜你喜欢

转载自www.cnblogs.com/lyricode/p/12383484.html