最近需要给之前的命令行程序写一个界面,使用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即可