分类 PyQt5 下的文章

PyQt5系列教程(十二)pyinstaller打包exe时subprocess无效的解决方法

软硬件环境

  • Windows 10
  • Python 3.5.2
  • PyQt5
  • pyinstaller

前言

前面一篇博文PyQt5系列教程(十)pyinstaller打包exe已经介绍过如何使用pyinstaller打包exe,最近在打包包含subprocess.Popen时发现,加上参数—noconsole时产生的exe文件在运行的时候,进程并没有正确运行。经过一番google,问题得以解决,现将解决方法记录一下,形成此文。

subprocess的使用

我这里需要利用subprocess.Popen创建一个进程去执行一个命令行操作,

mProcess = subprocess.Popen(cmd,stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True)

pyinstaller打包操作命令如下

pyinstaller -F --noconsole --clean --distpath release bin\\troutling

打包后生成的exe,可以运行,不过查看进程并没有如预期正确地工作。

解决方法

在创建进程时,加上startupinfo参数,如下

si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
mProcess = subprocess.Popen(cmd,stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True,startupinfo=si)

问题完美解决,具体可以参考下参考资料

参考资料

1 https://github.com/pyinstaller/pyinstaller/wiki/Recipe-subprocess

2 https://github.com/djstava/troutling

PyQt5系列教程(十一)发送信号时传参

软硬件环境

  • Windows 10
  • PyQt5
  • Python3.4

前言

在PyQt5编程中,经常需要在某个signal发送时附带相应的数据,实际上就是传参,然后在slot方法中接收传递过来的数据,这样就可以非常灵活地实现一些业务逻辑。好了,本文就来实现这个功能。

实践

首先是生成一个signal

transcoding_thread_status = pyqtSignal(object)

然后将signal和slot方法绑定

self.transcoding_thread_status.connect(self.slotShowTransThreadStatus)

slot方法接收数据

def slotShowTransThreadStatus(something):
    print(something)

最后来看看,signal emit时是怎么实现的

self.transcoding_thread_status.emit("Hello")

至此数据就传递成功了,就是这么简单。

以上是传递一个参数,那如果我需要传递2个呢,是不是也可以用上面的方法呢?思路是一样的,细节做一点小修改就好了。

transcoding_thread_status = pyqtSignal(str,str)

如果传递的数据类型是整形的话,就换成int,对应的slot方法也要跟着修改

def slotShowTransThreadStatus(something,anything):
    print(something)
    print(anything)

发送信号时,就跟上2个参数

self.transcoding_thread_status.emit("Hello","world")

类似的,如果需要传递更多参数,请依葫芦画瓢。

源码下载

https://github.com/djstava/troutling,这个项目是一个带GUI的ffmpeg wrapper。因为最近正在做一个电视直播的项目,其中涉及到音视频的实时再编码及HLS相关的内容,为了更加方便的进行节目源(目前是UDP的流)转码,就做了个这个小工具。使用的是Windows+PyQt5+Python3。

PyQt5系列教程(十)pyinstaller打包exe

软硬件环境

  • Windows 10
  • PyQt5
  • Python3.4
  • pyinstaller

前言

前文PyQt5系列教程(三)用py2exe进行程序打包介绍了如何使用py2exe来给python3工程打包,本文介绍另一个打包工具pyinstaller,个人感觉比py2exe更加简单、方便。

pyinstaller安装

命令行中执行

pip3 install pyinstaller

打包exe

工程还是以之前的为例,下载地址是http://download.csdn.net/detail/djstavav/9351205,解压进入工程目录,命令行执行打包命令

pyinstaller -F --distpath release main.py

pyinstaller_01

pyinstaller_02

pyinstaller_03

pyinstaller的打包参数很多,需要的话通过help来查看

pyinstaller -h

参考资料

1、http://www.pyinstaller.org/

PyQt5系列教程(八)定时器QTimer的使用

软硬件环境

  • OS X EI Capitan
  • Python 3.5.1
  • PyQt 5.5.1

前言

如果需要在程序中周期性地进行某项操作,比如检测某种设备的状态,就会用到定时器。本文就来看看PyQT5中的QTimer的使用。

QTimer示例

假设要实现每过一秒计数一次这个功能,来看看QTimer怎么实现?

self.timer = QTimer(self)
self.count = 0
self.timer.timeout.connect(self.showNum)
self.startCount()

首先实例化一个timer,然后将它的timeout信号和自定义的showNum()方法绑定。最后调用startCount()这个方法开始这个定时器。上述几条语句一般放在window或者form的构造函数里。完整的例子自己去写写吧,也很简单。

startCount()方法

def startCount(self):
    self.timer.start(1000)

timer.start()时间参数的单位是毫秒,这点要注意,相当于时间每过一秒,timer的timeout()就会被触发一次,而信号timeout又是和槽showNum()绑定在一起的,所以showNum()也会被调用一次。

showNum()槽函数

def showNum(self):
    count = count + 1
    print(count)

PyQt5系列教程(九)QInputDialog的使用

软硬件环境

  • Ubuntu 15.10 32bit
  • Python 3.5.1
  • PyQt 5.5.1

前言

输入框是界面开发中非常常见的控件,本文就来看看PyQt5中QInputDialog的使用

实例

本例将实现如下效果图:

QInputDialog_01.png

由用户输入生产订单号,当订单号不空且点击OK按钮时,则跳转到其他界面,否则,弹框报错,退出系统。

def showPONInputDialog(self):
    opN,okPressed = QInputDialog.getText(self,"**科技","请输入生产订单号:",QLineEdit.Normal, " ")
    if okPressed and opN.strip():
        print('PON:' + opN)
        logging.info('PON:' + opN)
        self.poNumber = opN
        self.lineedit_order.setText(self.poNumber)

    else:
        QMessageBox.critical(self,ERRORTITLE,"请输入订单号,点击OK进入系统!")
        exit(1)

getText方法的返回值是一个元组(str,bool),样式为QLineEdit.Normal,常用的还有QLineEdit.Password。方法showPONInputDialog一般放再mainwindown中实现。