从这篇文章开始,我想开一个全新的系列,谈一谈关于列车运行图的各种杂七杂八,主要是关于我开发的软件pyETRC。其实这个系列我想了很久了,一直想写点东西,但这个项目实在太大,一时半会不知道如何下手。毕竟从2018年开始,这个项目至今已经积累了至少2万行代码。如果要从整个项目的背景、基本设定开始讲,那将是一个令人望而生畏的大工程,可能几十篇推送也讲不完。最近想了想,干脆就从近来的工作随便写点吧。这个系列不定期更新,当写到什么有意思的,想吹一吹的东西时,就更新(老鸽子了x)。
虽然作为这个系列的第一篇推送,但这篇文章仅仅是关于最近工作的一点东西。说实话,我并没有考虑要写什么样的文章,只是个杂谈,所以这篇推送将会既包括代码实现的内容,也包括运行图方面的内容。
这个项目基于Python3和PyQt5,这篇文章会包含一些相关的内容。
01
—
背景
按道理,作为整个系列的开篇,我应该先给一下整个系统的介绍,但很遗憾,我暂时没有这个兴致来做这么大一个工程。如果有兴趣,可移步github或者我们的在线文档。(点击“阅读原文”进入本项目在线文档;文档首页有更多信息)
下面图给出的是程序的主界面。这篇文章的背景,就是大约一两个月前,我收到反馈,“标尺编辑”页面的“均速”计算有问题。经过检查,发现是程序运行后,每次打开新的运行图后,“均速”对应的区间里程信息没有更新所致。
按:“标尺”或称“区间运行时分标准”,它规定列车在铁路线路的每个区间运行的时间。
02
—
原始代码
“标尺编辑”一直被作为pyETRC项目的一大特色,也是立项之初就开始写的功能,随着第一个发行版就上线了。这样也带来一个后果,就是早期写的代码实在是太烂了;但后面维护时,又轻易不敢动。
由于早期写这个项目的时候,没有充分引入面向对象的设计模式,而是把大多数代码都写到一个文件里(这个文件一度达到4000多行),当时为了回避添加过多的属性,很多信号、槽的连接都是用lambda表达式做的。虽然后期很多地方做了重构,但标尺部分的遗毒还在,比如,确定、取消按钮的连接:
btnOk.clicked.connect(lambda: self._apply_ruler_change(widget))btnCancel.clicked.connect(lambda: self._discard_ruler_change(widget))btnDel.clicked.connect(self._del_ruler)
为了实现每一行时间调整后,实时更新“均速”一栏的数据,当时是这样写的:
spinMin.valueChanged.connect(lambda: self._ruler_interval_changed( now_line, tableWidget, mile))spinSec.valueChanged.connect(lambda: self._ruler_interval_changed( now_line, tableWidget, mile))
其中no