qt5 串口助手 跨平台兼容
下载地址:http://qinfei-blog.oss-cn-hangzhou.aliyuncs.com/uploads/serial-helper.dmg
代码说明文档: https://damoyelang1992.github.io/serial-helper/doc/build/html/
兼容 OSX(测试环境:macOS Sierra 10.12)
兼容raspberry pi 3(测试环境:ubuntu Mate)
Windows 未测试。
代码环境: python3.5 PyQt5 以及其他依赖(requirements.txt)
打包出来的 app 文件太大(200M+), 所以需要删减, 具体删减结果见文章最后清单。
编译方法:
pip3 install virtualenv
mkdir myproject
cd myproject/
virtualenv --no-site-packages venv
source venv/bin/activate
git clone https://github.com/damoyelang1992/serial-helper.git
cd serial-helper
pip install -r requirements.txt
python main.py
教程(下面部分为引用此文章): http://www.jianshu.com/p/afb6b2b97ce9
安装 py2app:
pip install -U git+https://github.com/metachris/py2app.git@master
创建 setup.py 文件:
py2applet --make-setup main.py
查看文件内容,并修改相应信息(OPTIONS 添加了图标,下面不要忘记把文件添加进来哦):
from setuptools import setup
APP = ['main.py']
DATA_FILES = []
OPTIONS = {
'argv_emulation': True,
'iconfile': 'app.icns',
}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
添加图标文件等——修改:
DATA_FILES = ['testdata.json', 'picture.png']
创建开发版和测试版的应用:
python setup.py py2app -A
这并不是一个独立的应用,并且通过别名模式构建的应用不适用于其他机器。
别名模式下构建的应用直接引用了源码文件,所以任何对 main.py 文件作的修改在应用下次启动时会立刻生效。
构建发布版应用:
python setup.py py2app
打包成 dmg:
hdiutil create ptimer.dmg -srcfolder dist/ptimer.app
更高级设置:
# -*- coding: utf-8 -*-
from setuptools import setup
APP = ['Sandwich.py']
APP_NAME = "SuperSandwich"
DATA_FILES = []
OPTIONS = {
'argv_emulation': True,
'iconfile': 'app.icns',
'plist': {
'CFBundleName': APP_NAME,
'CFBundleDisplayName': APP_NAME,
'CFBundleGetInfoString': "Making Sandwiches",
'CFBundleIdentifier': "com.metachris.osx.sandwich",
'CFBundleVersion': "0.1.0",
'CFBundleShortVersionString': "0.1.0",
'NSHumanReadableCopyright': u"Copyright © 2015, Chris Hager, All Rights Reserved"
}
}
setup(
name=APP_NAME,
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
我手动重写了 serial.serialposix.CMSPAR 的值,如果没有重写 OSX 不支持 1校验 和 0校验,在 serial 库说明中提示在不支持的平台上需要重写这个值
from serial import serialposix
# modify CMSPAR to support darwin (OS X)
serialposix.CMSPAR = 1
另外注意串口接收部分与 miniterm minicom 都不一样,他们的接收会导致数据断开几部分。
MAC app 删减最终目录 tree:
.
└── Contents
├── Frameworks
│ └── Python.framework
│ ├── Python -> Versions/Current/Python
│ ├── Resources -> Versions/Current/Resources
│ └── Versions
│ ├── 3.6
│ │ ├── Python
│ │ ├── Resources
│ │ │ └── Info.plist
│ │ ├── include
│ │ │ └── python3.6m
│ │ │ └── pyconfig.h
│ │ └── lib
│ │ └── python3.6
│ │ └── config-3.6m-darwin
│ │ └── Makefile
│ └── Current -> 3.6
├── Info.plist
├── MacOS
│ ├── main
│ └── python
├── PkgInfo
└── Resources
├── __boot__.py
├── __error__.sh
├── app.icns
├── include
│ └── python3.6m
│ └── pyconfig.h
├── lib
│ ├── python3.6
│ │ ├── PyQt5
│ │ │ ├── Qt
│ │ │ │ ├── lib
│ │ │ │ │ ├── QtCore.framework
│ │ │ │ │ │ └── Versions
│ │ │ │ │ │ └── 5
│ │ │ │ │ │ └── QtCore
│ │ │ │ │ ├── QtGui.framework
│ │ │ │ │ │ └── Versions
│ │ │ │ │ │ └── 5
│ │ │ │ │ │ └── QtGui
│ │ │ │ │ ├── QtHelp.framework
│ │ │ │ │ │ └── Versions
│ │ │ │ │ │ └── 5
│ │ │ │ │ │ └── QtHelp
│ │ │ │ │ ├── QtMacExtras.framework
│ │ │ │ │ │ └── Versions
│ │ │ │ │ │ └── 5
│ │ │ │ │ │ └── QtMacExtras
│ │ │ │ │ ├── QtPrintSupport.framework
│ │ │ │ │ │ └── Versions
│ │ │ │ │ │ └── 5
│ │ │ │ │ │ └── QtPrintSupport
│ │ │ │ │ └── QtWidgets.framework
│ │ │ │ │ └── Versions
│ │ │ │ │ └── 5
│ │ │ │ │ └── QtWidgets
│ │ │ │ ├── plugins
│ │ │ │ │ ├── PyQt5
│ │ │ │ │ │ └── libpyqt5qmlplugin.dylib
│ │ │ │ │ ├── iconengines
│ │ │ │ │ │ └── libqsvgicon.dylib
│ │ │ │ │ ├── imageformats
│ │ │ │ │ │ ├── libqgif.dylib
│ │ │ │ │ │ ├── libqicns.dylib
│ │ │ │ │ │ ├── libqico.dylib
│ │ │ │ │ │ ├── libqjpeg.dylib
│ │ │ │ │ │ ├── libqmacjp2.dylib
│ │ │ │ │ │ ├── libqsvg.dylib
│ │ │ │ │ │ ├── libqtga.dylib
│ │ │ │ │ │ ├── libqtiff.dylib
│ │ │ │ │ │ ├── libqwbmp.dylib
│ │ │ │ │ │ └── libqwebp.dylib
│ │ │ │ │ ├── platforms
│ │ │ │ │ │ ├── libqcocoa.dylib
│ │ │ │ │ │ ├── libqminimal.dylib
│ │ │ │ │ │ └── libqoffscreen.dylib
│ │ │ │ │ └── printsupport
│ │ │ │ │ └── libcocoaprintersupport.dylib
│ │ │ │ └── translations
│ │ │ │ └── qt_en.qm
│ │ │ ├── Qt.so
│ │ │ ├── QtCore.so
│ │ │ ├── QtGui.so
│ │ │ ├── QtMacExtras.so
│ │ │ ├── QtPrintSupport.so
│ │ │ ├── QtWidgets.so
│ │ │ ├── __init__.py
│ │ │ ├── pyrcc.so
│ │ │ ├── pyrcc_main.py
│ │ │ └── uic
│ │ │ ├── Compiler
│ │ │ │ ├── __init__.py
│ │ │ │ ├── compiler.py
│ │ │ │ ├── indenter.py
│ │ │ │ ├── misc.py
│ │ │ │ ├── proxy_metaclass.py
│ │ │ │ ├── qobjectcreator.py
│ │ │ │ └── qtproxies.py
│ │ │ ├── Loader
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-36.pyc
│ │ │ │ │ ├── loader.cpython-36.pyc
│ │ │ │ │ └── qobjectcreator.cpython-36.pyc
│ │ │ │ ├── loader.py
│ │ │ │ └── qobjectcreator.py
│ │ │ ├── __init__.py
│ │ │ ├── driver.py
│ │ │ ├── exceptions.py
│ │ │ ├── icon_cache.py
│ │ │ ├── objcreator.py
│ │ │ ├── port_v2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-36.pyc
│ │ │ │ │ ├── as_string.cpython-36.pyc
│ │ │ │ │ ├── ascii_upper.cpython-36.pyc
│ │ │ │ │ ├── proxy_base.cpython-36.pyc
│ │ │ │ │ └── string_io.cpython-36.pyc
│ │ │ │ ├── as_string.py
│ │ │ │ ├── ascii_upper.py
│ │ │ │ ├── proxy_base.py
│ │ │ │ └── string_io.py
│ │ │ ├── port_v3
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-36.pyc
│ │ │ │ │ ├── as_string.cpython-36.pyc
│ │ │ │ │ ├── ascii_upper.cpython-36.pyc
│ │ │ │ │ ├── proxy_base.cpython-36.pyc
│ │ │ │ │ └── string_io.cpython-36.pyc
│ │ │ │ ├── as_string.py
│ │ │ │ ├── ascii_upper.py
│ │ │ │ ├── proxy_base.py
│ │ │ │ └── string_io.py
│ │ │ ├── properties.py
│ │ │ ├── pyuic.py
│ │ │ ├── uiparser.py
│ │ │ └── widget-plugins
│ │ │ ├── __pycache__
│ │ │ │ ├── qaxcontainer.cpython-36.pyc
│ │ │ │ ├── qscintilla.cpython-36.pyc
│ │ │ │ ├── qtcharts.cpython-36.pyc
│ │ │ │ ├── qtprintsupport.cpython-36.pyc
│ │ │ │ ├── qtquickwidgets.cpython-36.pyc
│ │ │ │ ├── qtwebenginewidgets.cpython-36.pyc
│ │ │ │ └── qtwebkit.cpython-36.pyc
│ │ │ ├── qaxcontainer.py
│ │ │ ├── qscintilla.py
│ │ │ ├── qtcharts.py
│ │ │ ├── qtprintsupport.py
│ │ │ ├── qtquickwidgets.py
│ │ │ ├── qtwebenginewidgets.py
│ │ │ └── qtwebkit.py
│ │ ├── config-3.6m-darwin
│ │ ├── lib-dynload
│ │ │ ├── _bisect.so
│ │ │ ├── _blake2.so
│ │ │ ├── _bz2.so
│ │ │ ├── _codecs_cn.so
│ │ │ ├── _codecs_hk.so
│ │ │ ├── _codecs_iso2022.so
│ │ │ ├── _codecs_jp.so
│ │ │ ├── _codecs_kr.so
│ │ │ ├── _codecs_tw.so
│ │ │ ├── _ctypes.so
│ │ │ ├── _datetime.so
│ │ │ ├── _decimal.so
│ │ │ ├── _elementtree.so
│ │ │ ├── _hashlib.so
│ │ │ ├── _heapq.so
│ │ │ ├── _lzma.so
│ │ │ ├── _md5.so
│ │ │ ├── _multibytecodec.so
│ │ │ ├── _multiprocessing.so
│ │ │ ├── _opcode.so
│ │ │ ├── _pickle.so
│ │ │ ├── _posixsubprocess.so
│ │ │ ├── _random.so
│ │ │ ├── _sha1.so
│ │ │ ├── _sha256.so
│ │ │ ├── _sha3.so
│ │ │ ├── _sha512.so
│ │ │ ├── _socket.so
│ │ │ ├── _ssl.so
│ │ │ ├── _struct.so
│ │ │ ├── array.so
│ │ │ ├── binascii.so
│ │ │ ├── fcntl.so
│ │ │ ├── grp.so
│ │ │ ├── math.so
│ │ │ ├── mmap.so
│ │ │ ├── pyexpat.so
│ │ │ ├── resource.so
│ │ │ ├── select.so
│ │ │ ├── sip.so
│ │ │ ├── termios.so
│ │ │ ├── unicodedata.so
│ │ │ └── zlib.so
│ │ └── site.pyc -> ../../site.pyc
│ └── python36.zip
├── main.py
├── site.pyc
└── zlib.cpython-36m-darwin.so