一、问题由来

开发了一个PYQT5做为用户界面的记账软件,在开发机上启动速度还算可以,2秒左右,基本可以忍受,但在另一台笔记本上,首次超过10秒,第二次启动也有4秒左右,而且启动过程中无提示,就像没有运行或假死一样,所以想做一个splash screen界面来让用户知道程序正在启动,防止多次点出,程序运行多个实例。下边来说一个基本解决思路和实现过程。

二、解决方案思路

靠python来启动splash screen是不可行的,因为python解释器启动时间已经很长了,基本思路是用win32开发一个简单的程序,快速启动后提示程序正在启动,通过新建进程的方式启动pyqt5程序,splash 程序退出时机问题,为了尽量减小对原python程序的修改,需要splash程序退出时原python程序只要向标准输出打印特定的字符串,splash程序在新建进程时把python程序的stdout重定向到管道,启动进程后在一个新线程中从管道另一端读数据来判断,如果是特定的需要退出splash程序的字符串,就关闭splash程序。

三、本程序实现过程

1,win32新建窗口,无边框无标题栏,最前端显示,窗口在屏幕上居中;
2,定时器函数中GDI绘图画一个纯色背景,中间显示某程序正在启动;
3,做个伪进程条,如果进程100%还没有启动完成,再从0开时增加;
4,新线程中从管道读数据,读到预设的特定字符串就退出splash程序;

四、开发过程遇到的问题

1,新进程创建时不能在新控制台打开,这样管道读不到数据;
2,python程序向stdout输出数据后需做flush刷新缓存操作,否则splash程序不能及时读到数据;
3,控制台程序好象才可以重定向stdout,win32程序程序好象不行,用pythonw.exe运行程序不行;
4,在VS中调试程序时程序运行无效果不能打开新进程PYQT程序;

标签: PYQT5