python3 PyQt5 pyinstaller 打包太大,打包完40M。引用的库写在下面,求大神看怎再能精简一下!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3 PyQt5 pyinstaller 打包太大,打包完40M。引用的库写在下面,求大神看怎再能精简一下!!相关的知识,希望对你有一定的参考价值。

用在界面上的库如图,每一个模块都有用到。其他用到的库自己试了删除后再打包试了一下,对打包大小没什么影响,所以就不放出来了。主要是这三行代码使打包后太大了。程序执行界面如图。

参考技术A 我也是,谢了一个简单的格式化输出到txt的程序 居然有90M,惊呆了 ,期待有大神来科普下。追问

90M有点太大了吧?你是用了什么大型库吗?或者是把整个库都导进去打包了?使用库的时候最好是用from...import...,这样不会吧整个库导进去,只导入自己需要的,有效减小体积

参考技术B 建议不用导入Tkinter库,可以直接用pyqt自带的对话框库,打包出来还能小一些 参考技术C 背景
最近空闲之余,在使用wxpython写桌面应用程序,虽然界面确实不敢恭维,但是使用python的好处还是很多的,所以网上研究了下想要将py文件转换成exe的话需要用到pyinstaller ,当然还有其他的工具也是可以做到这个的,类似于py2exe等等,这里我就不介绍其他工具是怎么使用的,因为百度都是一大把的东西了。但是后来发现,使用pyinstaller path/xx.py 命令打包出现的文件里面不包含我需要的一些ico.png等等文件,那这个就比较麻烦了,因为每次打包成一个exe的时候,我必须还得手动去工程目录下,将对应的资源文件拷贝到我打包的路径下。所以特定google了一把,嗯 确实找到解决方法。
正文
其实想要找到解决方法,最好就是去官网看使用文档,没有什么东西会比它来的更方便了,所以我们先从官方的使用手册入手吧。找到我们需要的地方Using Spec Files,这里我们可能先得了解下Spec file是什么东西。这里我们看看官网的解释
the first thing PyInstaller does is to build a spec (specification) file myscript.spec. That file is stored in the –specpath= directory, by default the current directory.
The spec file tells PyInstaller how to process your script. It encodes the script names and most of the options you give to the pyinstaller command. The spec file is actually executable Python code. PyInstaller builds the app by executing the contents of the spec file.
For many uses of PyInstaller you do not need to examine or modify the spec file. It is usually enough to give all the needed information (such as hidden imports) as options to the pyinstaller command and let it run
以上的内容实际是告诉我们 我们在使用pyinstaller path/xx.py的时候,实际上如果你不指定–specpath的话默认会在当前的路径下生成一个spec文件,这个文件会告诉pyinstaller如何处理你的脚本,pyinstaller创建一个exe的文件就是依靠它里面的内容进行执行的。正常情况下你不需要去修改这个spec文件,除非你需要打包一个dll或者so文件或者其他数据文件时。
这个时候我们就需要先通过
pyi-makespec options name.py [other scripts ...]
1
来生成一个spec文件,再来就是增加我们需要的资源文件。
红色的框就是新增的资源文件
下来增加完以后 我们只要pyinstaller options name.spec 就可以将我们需要的资源文件打包到生成的文件目录下了。
---------------------

如何使用 Python、PyQt5 和 Pyinstaller 修复未正确显示的按钮

【中文标题】如何使用 Python、PyQt5 和 Pyinstaller 修复未正确显示的按钮【英文标题】:How to fix buttons not showing properly using Python, PyQt5, and Pyinstaller 【发布时间】:2018-11-20 10:33:18 【问题描述】:

我使用 Qt Designer 创建了一个界面,并使用 PyQt5 将其集成到我的 python 代码中。然后我使用 Pyinstaller 创建了一个 exe 文件,界面在使用 Windows 10 Home 的笔记本电脑上显示良好。然而,在使用 Windows 10 Pro 的不同 Windows 机器上进行的测试显示按钮和标签全部被剪掉,字体错误,如下图所示。例如,顶部标题应为 GEODISTANCE CALCULATOR',但仅显示“GEODISTANCE CA”。是什么导致了这种不兼容,我该如何解决这个问题?

我有下面的示例代码供任何想要测试样本的人使用:

from PyQt5 import uic, QtWidgets
import sys

app = QtWidgets.QApplication(sys.argv)

window = uic.loadUi('interface.ui')
window.show()

sys.exit(app.exec_())

从Qt Designer派生的ui文件的完整代码如下所示,可以通过将代码复制并粘贴到文本编辑器并将文件保存为'interface.ui'来重新创建文件:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>745</width>
    <height>534</height>
   </rect>
  </property>
  <property name="font">
   <font>
    <pointsize>28</pointsize>
    <weight>75</weight>
    <bold>true</bold>
   </font>
  </property>
  <property name="windowTitle">
   <string>GEODISTANCE PRO</string>
  </property>
  <property name="styleSheet">
   <string notr="true">QMainWindow
background-color: rgb(25, 31, 63);
</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>-70</x>
      <y>10</y>
      <width>811</width>
      <height>231</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">background-image: url(:/newPrefix/shutterstock-488566735.png);</string>
    </property>
    <property name="text">
     <string/>
    </property>
   </widget>
   <widget class="QLabel" name="label_2">
    <property name="geometry">
     <rect>
      <x>70</x>
      <y>120</y>
      <width>601</width>
      <height>71</height>
     </rect>
    </property>
    <property name="palette">
     <palette>
      <active>
       <colorrole role="WindowText">
        <brush brushstyle="SolidPattern">
         <color alpha="255">
          <red>255</red>
          <green>255</green>
          <blue>255</blue>
         </color>
        </brush>
       </colorrole>
       <colorrole role="Text">
        <brush brushstyle="SolidPattern">
         <color alpha="255">
          <red>255</red>
          <green>255</green>
          <blue>255</blue>
         </color>
        </brush>
       </colorrole>
       <colorrole role="ButtonText">
        <brush brushstyle="SolidPattern">
         <color alpha="255">
          <red>255</red>
          <green>255</green>
          <blue>255</blue>
         </color>
        </brush>
       </colorrole>
      </active>
      <inactive>
       <colorrole role="WindowText">
        <brush brushstyle="SolidPattern">
         <color alpha="255">
          <red>255</red>
          <green>255</green>
          <blue>255</blue>
         </color>
        </brush>
       </colorrole>
       <colorrole role="Text">
        <brush brushstyle="SolidPattern">
         <color alpha="255">
          <red>255</red>
          <green>255</green>
          <blue>255</blue>
         </color>
        </brush>
       </colorrole>
       <colorrole role="ButtonText">
        <brush brushstyle="SolidPattern">
         <color alpha="255">
          <red>255</red>
          <green>255</green>
          <blue>255</blue>
         </color>
        </brush>
       </colorrole>
      </inactive>
      <disabled>
       <colorrole role="WindowText">
        <brush brushstyle="SolidPattern">
         <color alpha="255">
          <red>120</red>
          <green>120</green>
          <blue>120</blue>
         </color>
        </brush>
       </colorrole>
       <colorrole role="Text">
        <brush brushstyle="SolidPattern">
         <color alpha="255">
          <red>120</red>
          <green>120</green>
          <blue>120</blue>
         </color>
        </brush>
       </colorrole>
       <colorrole role="ButtonText">
        <brush brushstyle="SolidPattern">
         <color alpha="255">
          <red>120</red>
          <green>120</green>
          <blue>120</blue>
         </color>
        </brush>
       </colorrole>
      </disabled>
     </palette>
    </property>
    <property name="font">
     <font>
      <family>RomanC</family>
      <pointsize>28</pointsize>
      <weight>50</weight>
      <bold>false</bold>
     </font>
    </property>
    <property name="autoFillBackground">
     <bool>false</bool>
    </property>
    <property name="text">
     <string>GEODISTANCE CALCULATOR</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_4">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>270</y>
      <width>181</width>
      <height>31</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="styleSheet">
     <string notr="true">color: rgb(255, 255, 255);</string>
    </property>
    <property name="text">
     <string>  STARTING SUBURB</string>
    </property>
   </widget>
   <widget class="QLineEdit" name="lineEdit">
    <property name="geometry">
     <rect>
      <x>210</x>
      <y>270</y>
      <width>301</width>
      <height>41</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>11</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>520</x>
      <y>430</y>
      <width>141</width>
      <height>61</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>11</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="cursor">
     <cursorShape>PointingHandCursor</cursorShape>
    </property>
    <property name="text">
     <string>ENTER</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_5">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>340</y>
      <width>181</width>
      <height>31</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="styleSheet">
     <string notr="true">color: rgb(255, 255, 255);</string>
    </property>
    <property name="text">
     <string>      FARE PER KM</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_6">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>450</y>
      <width>181</width>
      <height>31</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="styleSheet">
     <string notr="true">color: rgb(255, 255, 255);</string>
    </property>
    <property name="text">
     <string>     GOVT LEVY ($)</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_7">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>390</y>
      <width>171</width>
      <height>31</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="styleSheet">
     <string notr="true">color: rgb(255, 255, 255);
</string>
    </property>
    <property name="text">
     <string>       DISCOUNT</string>
    </property>
   </widget>
   <widget class="QLineEdit" name="lineEdit_2">
    <property name="geometry">
     <rect>
      <x>210</x>
      <y>330</y>
      <width>111</width>
      <height>41</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
   </widget>
   <widget class="QLineEdit" name="lineEdit_3">
    <property name="geometry">
     <rect>
      <x>210</x>
      <y>380</y>
      <width>111</width>
      <height>41</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
   </widget>
   <widget class="QLineEdit" name="lineEdit_4">
    <property name="geometry">
     <rect>
      <x>210</x>
      <y>440</y>
      <width>111</width>
      <height>41</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>745</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources>
  <include location="adelaide.qrc"/>
  <include location="filex.qrc"/>
 </resources>
 <connections/>
</ui>

【问题讨论】:

提供minimal reproducible example @eyllanesc 当然我已经用一个例子更新了这个问题 【参考方案1】:

通过添加更多代码行来解决此问题,如下所示。有人已经发布了这个答案,但他们删除了它可能认为这是错误的,因为我花了一段时间才回复他们结果,所以谢谢!

from PyQt5 import uic, QtWidgets
import sys

# Enable high DPI scaling
if hasattr(QtCore.Qt, 'AA_EnableHighDpiScaling'):
    PyQt5.QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)

if hasattr(QtCore.Qt, 'AA_UseHighDpiPixmaps'):
    PyQt5.QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)
app = QtWidgets.QApplication(sys.argv)

window = uic.loadUi('interface.ui')
window.show()

sys.exit(app.exec_())

【讨论】:

以上是关于python3 PyQt5 pyinstaller 打包太大,打包完40M。引用的库写在下面,求大神看怎再能精简一下!!的主要内容,如果未能解决你的问题,请参考以下文章

python3 PyQt5 pyinstaller 打包太大,打包完40M。引用的库写在下面,求大神看怎再能精简一下!!

PyQt5 Pyinstaller时出现错误Cannot find PyQt5 plugin directories

使用 PyInstaller 编译 PyQt5 Python 应用程序时遇到问题

Mac OS X Mavericks 上 PyQt5、Python3 和 Anaconda3 的问题

PyQt5快速入门PyQt5扩展

pyinstaller 打包pyqt5 报错