PyCharm下PyQT4+PyInstaller的使用

本文介绍如何使用Python和QTDesigner快速开发GUI界面,并利用PyInstaller进行应用打包的方法。通过直接调用.ui文件,实现界面的灵活修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇中讲了如何配置开发环境,今天讲一下在这个配置下如何进行简单界面的开发及打包。
本文将采用python直接调用QT Designer生成的.ui文件来产生界面。

  • 在PyCharm中新建一个工程
  • 新建一个test.py文件在工程中。可以使用如下的类似模板的文件内容。只需替换qtCreatorFile中的ui文件路径即可

import sys
import os
from __future__ import division
from PyQt4 import QtCore, QtGui, uic

# Define function to import external files when using PyInstaller.
def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

qtCreatorFile = "ui\example.ui" # your ui file path

Ui_MainWindow, QtBaseClass = uic.loadUiType(resource_path(qtCreatorFile))


class MyApp(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())
  • 使用QT Designer生成ui文件,保存到工程中
  • 使用PyInstaller进行打包, PyInstaller的安装自行百度吧,
    这里是相关参数的说明
usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]
                   [--add-data <SRC;DEST or SRC:DEST>]
                   [--add-binary <SRC;DEST or SRC:DEST>] [-p DIR]
                   [--hidden-import MODULENAME]
                   [--additional-hooks-dir HOOKSPATH]
                   [--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
                   [--key KEY] [-d] [-s] [--noupx] [-c] [-w]
                   [-i <FILE.ico or FILE.exe,ID or FILE.icns>]
                   [--version-file FILE] [-m <FILE or XML>] [-r RESOURCE]
                   [--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
                   [--win-no-prefer-redirects]
                   [--osx-bundle-identifier BUNDLE_IDENTIFIER]
                   [--distpath DIR] [--workpath WORKPATH] [-y]
                   [--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
                   [--upx UPX]
                   scriptname [scriptname ...]

例如下面这条命令,则将程序打包成一个单文件。

pyinstaller -F -w test.py

参数说明:-F 单文件模式 -w 不显示cmd窗口
不加参数则是单文件夹模式,生成的文件及.exe都会在一个文件夹下,默认是在dist目录下

  • 上一条命令执行后则会在.py的相同目录下生成同名的.spec文件,可以在这个文件中进行一些配置。以后打包就可以直接使用如下命令
pyinstaller test.spec
  • 在spec配置中一个地方的配置比较重要,关系到打包后的程序能否正常运行。
a = Analysis(['test.py'],
             pathex=['C:\\PythonProjects\\demo'],
             binaries=[],
             datas=[('example.ui', 'ui')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

就是这句datas=[(‘example.ui’, ‘ui’)] 需要手动添加,第一个参数是当前工程中ui文件的相对路径,第二个参数是打包后ui文件要放入的文件夹,如果想放在根目录下 可以使用”.”, 这里的配置与test.py 中的ui文件的读取代码是对应的,要保持一致。

小结:这样就可以随时根据需要修改ui文件了,而不需每次修改完UI后都要手动将ui文件转换为py文件。有一个地方需要注意一下,就是如果重新执行pyinstaller test.py 则会覆盖spec配置中的datats的设置。但生成spec后就可以用 pyinstaller test.spec进行打包了,spec中都会有相关的参数配置,icon等都可在这里进行设置。
具体可参考pyinstaller的官方文档:点击进入

### 如何在使用 PyQt5 和 PyCharm 开发串口上位机时将项目导出为可执行文件 #### 虚拟环境设置 为了确保项目的依赖项管理清晰并避免打包过程中出现问题,建议创建一个独立的 Python 虚拟环境。通过虚拟环境可以隔离不同项目的库版本冲突。 ```bash python -m venv my_env source my_env/bin/activate # Linux/MacOS my_env\Scripts\activate # Windows ``` #### 安装必要的库 在虚拟环境中安装所需的库,包括 `PyQt5` 和其他可能需要的工具: ```bash pip install pyqt5 pyserial pyinstaller ``` 如果需要额外的功能支持(如设计界面),还可以安装 `PyQt5-tools`[^1]: ```bash pip install pyqt5-tools ``` #### 使用 PyQt5 设计 GUI 界面 可以通过 Qt Designer 工具来设计图形化界面,并将其保存为 `.ui` 文件。之后利用 `pyuic5` 将其转换为 Python 可读的代码形式: ```bash pyuic5 your_design.ui -o ui_your_design.py ``` 此命令会生成一个名为 `ui_your_design.py` 的模块,可以在主程序中导入该模块以加载 UI 界面。 #### 编写主程序逻辑 编写主程序时需引入上述生成的 UI 模块以及处理串口通信的相关功能。以下是一个简单的示例框架: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow from ui_your_design import Ui_MainWindow # 替换为你自己的UI类名 import serial class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) # 初始化串口对象 self.serial_port = None def open_serial(self): try: port_name = self.ui.portComboBox.currentText() # 假设有一个下拉框用于选择端口号 baud_rate = int(self.ui.baudRateLineEdit.text()) # 获取波特率输入值 self.serial_port = serial.Serial(port=port_name, baudrate=baud_rate) print(f"Serial Port Opened: {port_name}") except Exception as e: print(f"Error opening serial port: {e}") if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` #### 打包成 EXE 文件 完成开发后,可以使用 `PyInstaller` 来将整个应用程序及其依赖项打包为单个可执行文件。以下是具体操作步骤: 1. **进入项目目录** 切换到包含主脚本的目录。 2. **运行 PyInstaller 命令** 下列命令会生成一个单独的 EXE 文件,适用于分发给不熟悉 Python 的用户: ```bash pyinstaller --onefile --noconsole main_script.py ``` 如果希望保留控制台窗口以便调试,则移除 `--noconsole` 参数。 3. **解决潜在问题** 在某些情况下,可能会遇到缺少特定插件的问题,例如无法找到或加载 Qt 平台插件 "windows"[^2]。此时可通过手动指定路径的方式解决问题,在 PyInstaller 中加入如下参数: ```bash pyinstaller --onefile --noconsole --add-data="path_to_qt_plugins;." main_script.py ``` 需要替换 `path_to_qt_plugins` 为实际的 Qt 插件所在位置。 #### 测试生成的 EXE 文件 最后一步是在目标机器上测试生成的 EXE 文件是否能够正常启动和工作。如果有任何异常情况发生,请返回检查配置或者重新调整打包选项。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值