• pyqt5:GUI界面搭建及含图片一起打包成一个.exe(windows环境下)


    UI界面搭建

    有两种方式:

    • 我们可以通过直接用代码编程直接构建gui界面,缺点是不够直观便捷,较复杂。
    • 通过QtDesigner用鼠标拖拽的方式,能够非常快捷直观高效的搭建界面。

    用代码编写界面

    示例:
    参考链接

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    """
    ZetCode PyQt5 tutorial 
    
    In this example, we position two push
    buttons in the bottom-right corner 
    of the window. 
    
    Author: Jan Bodnar
    Website: zetcode.com 
    Last edited: August 2017
    """
    
    import sys
    from PyQt5.QtWidgets import (QWidget, QPushButton, 
        QHBoxLayout, QVBoxLayout, QApplication)
    
    class Example(QWidget):
    
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            okButton = QPushButton("OK")
            cancelButton = QPushButton("Cancel")
    
            hbox = QHBoxLayout()
            hbox.addStretch(1)
            hbox.addWidget(okButton)
            hbox.addWidget(cancelButton)
    
            vbox = QVBoxLayout()
            vbox.addStretch(1)
            vbox.addLayout(hbox)
    
            self.setLayout(vbox)    
    
            self.setGeometry(300, 300, 300, 150)
            self.setWindowTitle('Buttons')    
            self.show()
    
    
    if __name__ == '__main__':
    
        app = QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    在这里插入图片描述

    用QtDesigner

    建议安装anaconda这个工具,以及IDE: pycharm可以像如下图配置QtDesigner,在主界面的Tools -> External Tools里可以直接启动QtDesigner(有个小问题,因为我的系统里有安装QT,所以不能确定安装anaconda就包含QtDesigner还是需要另外安装Qt,大家可以尝试只安装anaconda是否能找到/Anaconda3/Library/bin/designer.exe,如果不能就需要装QT)在这里插入图片描述 在这里插入图片描述

    *.ui文件生成py文件

    • 在目录下会生成mainwindow.ui,我们通过命令可以将ui文件生成*.py文件,在主程序中调用;也可以直接在主程序中调用*.ui文件(但这种方式,在打包好之后,需要在exe文件同级目录下要放入*.ui文件才能运行,不太符合我们的期望)。
    pyuic5 -o main_ui.py mainwindow.ui
    
    • 1
    • 在主程序中调用这个main_ui.py。方式有很多中,这里采用继承的方式。参考链接

    界面中包含图片

    • 这里我用到很多初始化图片,在打包的时候,希望也能打包到exe文件中,可以这样操作。
      通过代码将图像编码为二进制文件,可以在打包的时候直接打包到主程序中。(如果不按照下面的方式操作,最终打包的exe文件是不会把图片打包进去的)

    新建img.qrc文件,内容如下。

    <RCC>
        <qresource prefix="/">
            <file>img/bev_img.png</file>
            <file>img/bev_label.png</file>>
            <file>img/icon.bmp</file>>
            <file>img/label_finish.png</file>>
            <file>img/img.jpg</file>>
        </qresource>
    </RCC>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 用pyrcc5将img.qrc文件编码为*.py,用于在主程序中调用。
    pyrcc5 -o img.py img.qrc
    
    • 1

    img.py文件内容如下:

    # -*- coding: utf-8 -*-
    
    # Resource object code
    #
    # Created by: The Resource Compiler for PyQt5 (Qt v5.9.7)
    #
    # WARNING! All changes made in this file will be lost!
    
    from PyQt5 import QtCore
    
    qt_resource_data = b"\
    \x00\x05\xf6\xa3\
    \x00\
    \x1a\xab\x1a\x78\x9c\xec\x9d\x07\xb8\x15\xc5\xf9\xc6\x0f\xd6\x04\
    \x63\xc5\x1e\x2b\xb1\x46\x8d\x35\xb6\xd8\x0d\x76\x8d\x0d\x63\x89\
    \x89\x89\x25\x96\xd8\x5b\xd4\xa0\x44\x7a\xef\x17\x2e\xbd\x48\x07\
    \x51\xb1\xf7\x02\x4a\xef\x28\x22\x82\x14\x45\x44\xa4\x57\x81\xf3\
    \x7f\xdd\x37\x67\xfe\x73\x67\x77\x67\x67\x67\x67\xf7\x9c\x8b\xf7\
    \x7d\x1e\x7d\x2e\x7b\x76\xca\x4e\xfb\x7e\xfb\x4d\xd9\xf3\x2e\xdf\
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    主程序编写

    在主程序中直接import这个py,及导入main_ui.py中的Ui_LaneMarkTool,图像输入路径类似’:/img/icon.bmp’,这个冒号是必须的?我是参考网上的,我也不确定。

    from ui import Ui_LaneMarkTool
    import img
    
    
    class MainFrame(QMainWindow, Ui_LaneMarkTool):
        def __init__(self):
            super(MainFrame, self).__init__()
            # uic.loadUi('mainwindow.ui', self)
            # self.show()
            self.setupUi(self)
            # self.setCentralWidget(self.Form)
            self.setWindowIcon(QIcon(':/img/icon.bmp'))
            self.labelBEVImage.setPixmap(QPixmap(':/img/bev_img.png'))
            self.labelBEVImage.setScaledContents(True)
            self.labelBEVLabel.setPixmap(QPixmap(':/img/bev_label.png'))
            self.labelBEVLabel.setScaledContents(True)
            self.labelBEVLabelFinished.setPixmap(QPixmap(':/img/label_finish.png'))
            self.labelBEVLabelFinished.setScaledContents(True)
            self.labelFrontImage.setPixmap(QPixmap(':/img/img.jpg'))
            self.labelFrontImage.setScaledContents(True)
    
    
    if __name__ == "__main__" :
        app = QApplication(sys.argv) 
        main_frame = MainFrame()
        main_frame.show()
        sys.exit(app.exec_())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    pyinstaller打包程序

    可以用anaconda创建一个新的虚拟环境,只安装需要用到的包,然后在打包,据说这样打包的exe文件会比较小,比较干净。

    pip install pyinstaller
    pyinstaller -F -w -i icon.ico LaneMarkTool.py
    # 这里图标可以直接在线生成一个
    
    • 1
    • 2
    • 3

    在线生成icon链接

  • 相关阅读:
    kafka的组件讲解(持续更新)
    如何使用lerna进行多包(package)管理
    Win11校园网无法连接怎么办?Win11连接不到校园网的解决方法
    我用GPT搭建了一个虚拟女友!
    Codeforces Round #786 (Div. 3) ABCDE
    【数据结构与算法】之深入解析“对角线遍历II”的求解思路与算法示例
    K-verse 小型活动来袭!
    常用的原型工具有哪些?推荐这7款
    Golang 程序启动原理详解
    Gateway--服务网关
  • 原文地址:https://blog.csdn.net/qq_39506862/article/details/126879682