![]() |
Using pyinstaller with .ui GUI files - No such file or directory error - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: Using pyinstaller with .ui GUI files - No such file or directory error (/thread-40235.html) |
Using pyinstaller with .ui GUI files - No such file or directory error - diver999 - Jun-26-2023 Hi All, I'm sure I'm not the first to encounter this but can't seem to find a solution.I hope someone can help. I'm using W11, python 3.11 & PyQt5. My python code uses the .ui rather than a compiled .py file & I'm trying to use pyinstaller to make a single .exe. Here's an example which shows the problem. I have seen solutions proposed that need the .ui to be compiled into a.py file. I'd rather not go that route if I can help it. It's a pain to have to compile the .ui every time a change is made & I'll also have to re-write my existing code. .py code: from PyQt5 import QtWidgets, uic class HelloApp(object): def __init__(self, app): self.app = app self.ui = uic.loadUi('helloGUI.ui') self.ui.show() self.run() def run(self): self.app.exec_() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) HelloApp(app)... the .ui xml code from PyQt5 <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>Form</class> <widget class="QWidget" name="Form"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>260</width> <height>132</height> </rect> </property> <property name="windowTitle"> <string>Hello</string> </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QLabel" name="label"> <property name="font"> <font> <family>Arial</family> <pointsize>44</pointsize> <weight>50</weight> <italic>true</italic> <bold>false</bold> <kerning>true</kerning> </font> </property> <property name="text"> <string>Hello</string> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> </layout> </widget> <resources/> <connections/> </ui>This should just throw up a simple window with Hello in the middle. I'm using pyinstaller --onefile --add-data="helloGUI.ui;." HelloApp.py which seems to work, but when I run the .exe in the dist folder, I get a window pop up with: Traceback (most recent call last): File "helloAPP.py", line 20, in <module> File "helloAPP.py", line 10, in __init__ File "PyQt5\uic\__init__.py", line 241, in loadUi File "PyQt5\uic\Loader\loader.py", line 66, in loadUi File "PyQt5\uic\uiparser.py", line 1020, in parse File "xml\etree\ElementTree.py", line 1218, in parse File "xml\etree\ElementTree.py", line 569, in parse FileNotFoundError: [Errno 2] No such file or directory: 'helloGUI.ui' If I add the .ui file to the dist folder, all is OK. I've also tried running the .exe on a machine without python installed & again all is OK if the .ui is in the same folder. Thanks in advance, Dave RE: Using pyinstaller with .ui GUI files - No such file or directory error - Axel_Erfurt - Jun-26-2023 On Mac / Linux use : --add-data="helloGUI.ui:."
RE: Using pyinstaller with .ui GUI files - No such file or directory error - snippsat - Jun-26-2023 Add this,then it should work. from PyQt5 import QtWidgets, uic import sys, os if getattr(sys, 'frozen', False): os.chdir(sys._MEIPASS) class HelloApp(object): def __init__(self, app): self.app = app self.ui = uic.loadUi('helloGUI.ui') self.ui.show() self.run() def run(self): self.app.exec_() if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) HelloApp(app)In many cases for lager prosje is better to use --onedir ,then do not need to fix _MEIPASS (the path that a single .exe will use)pyinstaller --clean --windowed --onedir --add-data helloGUI.ui;. qt_code.pyThen later can eg pack it with eg Inno Setup then get single setup.exe which has a installer.Or can just .zip to one file,and share that. It depend one use case a singe .exe is easy to share a,but many will not a run a executable .exe if not sure what is. A installer(that also has a uninstaller) also make some Doc,is the professional looking way if want to share in a larger scale. RE: Using pyinstaller with .ui GUI files - No such file or directory error - diver999 - Jun-27-2023 Thanks snippsat, the additional bit worked fine. I'll certainly look at your further suggestions too. It's windows btw. |