点击上方蓝字[协议分析与还原]关注我们


解决一闪而过的黑框的小技巧。

在使用python开发过程中,不可避免地,会开发带界面的应用,也会经常使用js来完成一些功能,比如,我使用python开发个了一个小应用:

做了一款股票复盘工具

这个里面,使用PTQT5开发的界面UI,里面大部分功能使用Python实现的,但有很小的一些功能,是使用js来实现的,最后打包成exe,使用的是pyinstaller,很方便,但是也有些小问题。

我们的exe,是带界面的,当然不希望黑色的命令行窗口存在,如果代码实现中没有使用js,那很好解决:

pyinstaller -F -w xxx.py

看起来很像样子。

但是,如果用到了js,而我们又用到了PyExecJS库来执行js,那就有些麻烦了,这个库在没有打包时,一切都是正常的,但帮我们把exe打包后,这个库会在执行js的时候,让黑色的命令行窗口闪现,很讨厌,明明一切执行正常,却偏偏闪一下黑窗。

另外,这个库已经停止维护了,所以只能自己找原因了。

我们一般使用PyExecJS来执行js的方法如下:

import execjs
ctx = execjs.compile(jsstr)
out =ctx.call('v')

出现pyinstaller打包程序黑窗一闪而过的原因,是因为call的最终执行的函数是_external_runtime.py里面某个类里的_exec_with_pipe(self, source),直接搜到它:

def _exec_with_pipe(self, source):cmd = self._runtime._binary()p = Nonetry:p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=self._cwd, universal_newlines=True)input = self._compile(source)if six.PY2:input = input.encode(sys.getfilesystemencoding())stdoutdata, stderrdata = p.communicate(input=input)ret = p.wait()finally:del pself._fail_on_non_zero_status(ret, stdoutdata, stderrdata)return stdoutdata

看到了吗?上面这个函数的第五行,它使用的其实是Popen来实现执行js的功能。这个Popen,默认情况下当然会有黑色命令行界面的存在,在pyinstaller打包时设置了不要命令行界面也没有用。

找到了问题的原因,那就解决它,我们知道,Popen设置startupinfo为STARTF_USESHOWWINDOW即可隐藏命令行界面窗口,那我们就修改_external_runtime.py这个文件,加上它:

def _exec_with_pipe(self, source):cmd = self._runtime._binary()p = Nonetry:startupinfo = subprocess.STARTUPINFO()startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOWp = Popen(cmd, startupinfo=startupinfo, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=self._cwd, universal_newlines=True)input = self._compile(source)if six.PY2:input = input.encode(sys.getfilesystemencoding())stdoutdata, stderrdata = p.communicate(input=input)ret = p.wait()finally:del pself._fail_on_non_zero_status(ret, stdoutdata, stderrdata)return stdoutdata

再试试使用pyinstaller来打包用PyExecJS库来执行js的GUI应用,是不是一切正常没有讨厌的一闪而过的黑框了?

解决了这个问题,一下子让GUI应用高档不少,不再山寨了。

上次开发的股票复牌工具,虽然发给了几个朋友,但是,真的很山寨,现在把它更新了一番,想更新的,找我要啦。

如果有想法,随时交流。

别忘点“在看”、“赞”和“分享”

新的规则,及时收推文要先给公号星标

别忘了星标一下,不然就错过了

长按进行关注,时刻进行交流。

如何在python开发的GUI界面程序中恰当地使用PyExecJS相关推荐

  1. python开发的gui界面,python写gui应用程序

    python 编写gui界面有哪些 安装wxPython下面是wxPython特别基础的使用方法,将以一个小程序为例来说明,它的功能是在一个文本框中输入文件名,点击open按钮,会在另一个文本框中显示 ...

  2. Python开发图形可视化界面程序(一)

    前言 近来使用Python开发了一些简单的辅助脚本,发现这真的是一门很有趣的语言:于是乎,便想着使用python来开发一些具有图形可视化界面(GUI)的程序,对于python来说,支持其开发GUI可视 ...

  3. 用Python制作可视化GUI界面,一键实现证件照背景颜色的替换

    今天,我们来分享一下如何通过Python的十来行代码来替换证件照的背景颜色,那么在最后,小编也会将上述的流程制作成一个GUI界面来方便大家使用.关于界面的大致模样其实和先前的相差不大,大家应该都看过上 ...

  4. Python开发指南[1]之程序员计时小时钟(附源码)

    Python开发指南[1]之程序员计时小时钟 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 Python作为一门编程语言,这门语言的魅力和影响力已经远超C#.C++等编程 ...

  5. 用 Python 制作可视化 GUI 界面,一键实现自动分类管理文件!

    作者 | 欣一 来源 | Python爱好者集中营 经常杂乱无章的文件夹会让我们找不到所想要的文件,因此小编特意制作了一个可视化GUI界面,通过输入路径一键点击实现文件分门别类的归档. 不同的文件后缀 ...

  6. Matlab GUI界面表格中数据导出到excel文件带标题

    Matlab GUI界面表格中的数据导出到excel文件带标题 data=get(handles.uitable1,'Data'); ht={'日期','编号','姓名'}; [filename,pa ...

  7. python如何在网络爬虫程序中使用多线程(threading.Thread)

    python如何在网络爬虫程序中使用多线程 一.多线程的基础知识 二.在网络爬虫中使用多线程 2.1 从单线程版本入手 2.2 将单线程版本改写为多线程版本 2.3 运行多线程版本程序 2.4 将多线 ...

  8. python开发的优秀界面-八款常用的 Python GUI 开发框架推荐

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 乔柯 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  9. Python 使用PyQt5进行界面程序开发

    目的:使用PyQt5进行界面程序开发 环境: 问题: 解决方案: 步骤: 附代码如下: 环境: 系统:win10 IDE: Pycharm 2018.1.4 Python版本: 3.6.4 问题: 之 ...

最新文章

  1. linux启动,重启,停止 jar,.sh脚本
  2. 进程池的同步方法 pool.apply
  3. 《计算机组成原理》----1.5 存储程序的概念
  4. ie浏览器跳转谷歌浏览器_微软IE浏览器的命运:加速死亡
  5. 【模板】吉老师线段树
  6. fastslam matlab,fastslam 快速定位和构图的源码,一个简单的例子,3D建模,可以用作学习智能机器人自主移动 matlab 272万源代码下载- www.pudn.com...
  7. 关于AIR 应用程序沙箱
  8. PHP面试题 - MySQL数据库
  9. Hibernate 主键
  10. av_malloc 与 av_free 的函数原型
  11. 用SPSS搞定问卷调查中的决断值
  12. 黑盒测试与白盒测试的区别
  13. python中diet是什么意思_Python基础语法(你不得不知的几种变量类型
  14. [王垠系列]TeXmacs:一个真正“所见即所得”的排版系统
  15. 自然语言处理1—文本预测操作
  16. 聚观早报 | 吉利正式收购魅族科技;雷军:对标iPhone不是口号
  17. window安装mysql默认密码忘记_MySQL忘记root密码的处理办法及安装windows服务
  18. thinkPHP中{$Think }用法
  19. arm linux关机命令,嵌入式Linux的关闭命令是什么?
  20. 计算机毕业设计ssm基于SSM的美妆分享网站vf952系统+程序+源码+lw+远程部署

热门文章

  1. (二)spring cloud微服务分布式云架构 - 整合企业架构的技术点
  2. dubbo学习过程、使用经验分享及实现原理简单介绍
  3. 混合托管:第三代云计算
  4. 博客5:文件,目录以及用户的权限管理
  5. 【Cocos2d开发】Cocos2d下安卓环境的搭建
  6. 【安全运维】 linux 系统账户,网络,简易安全加固方案(第一部分),经测试可行...
  7. 【转】 LDA必读的资料
  8. 批处理解决“易语言难题”
  9. xx学OD -- 消息断点 RUN跟踪(上)
  10. 使用Windows远程登录Ubuntu