最近需要给之前的命令行程序写一个界面,使用Qt-designer拖界面还是比较方便的,其中一个比较麻烦的问题就是实时输出日志的问题,直接使用os.popen
会导致窗口进程直接卡死,需要使用qt提供的Qprocess来处理,然而最终还是有问题;才发现是python的缓存问题,直接运行可以使用-u
解决,但是pyinstaller打包不支持unbuffered,最终使用了py2exe
pyqt5
高分屏支持
os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"
Qprocess子进程
为了防止大批量的任务导致窗口进程卡死,需要使用qt实现的qprocess来调用,使用os.popen 和 subprocess都是会出问题的
self.process = QtCore.QProcess()
self.textEdit.clear()
self.process.start(command)
系统命令实时日志获取
因为python缓冲区的问题,误以为是qt这部分的问题
# process 部分
self.process.readyRead.connect(self.dataReady)
# 输出槽函数
def dataReady(self):
cursor = self.textEdit.textCursor()
cursor.movePosition(cursor.End)
text = self.process.readAll()
cursor.insertText(str(text))
self.textEdit.ensureCursorVisible()
print(text)
打包
使用了好几个打包成exe的工具,发现基本都没办法很好的支持unbuffered,不关闭缓存就无法正常地实时获取运行的日志,pyinstaller, cxfreeze 直接打包还可以,但是不支持,还是py2exe好用
pyinstaller
# 其他程序没有二进制依赖可以不加--paths
pyinstaller --paths C:\Users\firer\.virtualenvs\compress_images-8VD5V_Md\Lib\site-packages\PyQt5\Qt\bin -F -w .\image_compress_ui.py
cxfreeze
需要打包的文件夹创建setup.py
(任意名字都可以)
import sys
from cx_Freeze import setup, Executable
include_files = []
build_exe_options = {'packages': ['PIL'],
'excludes': [],
'include_files':include_files
}
base = None
if sys.platform == 'win32':
base = 'Win32GUI'
setup( name = 'imagesCompress',
version = '0.1',
description = '文件压缩',
options = {'build_exe': build_exe_options},
executables = [Executable('image_compress.py')])
然后执行 python .\setup.py build
py2exe
同cxfreeze
import os
from distutils.core import setup
import py2exe
Mydata_files = []
# for files in os.listdir('C:/path/to/image/directory/'):
# f1 = 'C:/path/to/image/directory/' + files
# if os.path.isfile(f1): # skip directories
# f2 = 'images', [f1]
# Mydata_files.append(f2)
setup(
console=['image_compress.py'],
data_files = [],
options={
"py2exe":{
"unbuffered": True, # 这句很关键
"optimize": 2,
"excludes": []
}
}
)
然后执行python .\py2exe_setup.py py2exe
即可