From 0b7f6f5af2efbcde280dc41f7210144f0d036648 Mon Sep 17 00:00:00 2001 From: daale010 <tim.vandaalen@wur.nl> Date: Tue, 2 Nov 2021 11:56:38 +0100 Subject: [PATCH] icons are now loaded in exe and debugger --- gui/ui_files/MainMenu.py | 2 +- gui/ui_files/__pycache__.py | 2 +- gui/ui_files/createCollection.py | 2 +- gui/ui_files/dataTransferState.py | 2 +- gui/ui_files/icons.py | 10 ++++ gui/ui_files/irodsIndexPopup.py | 2 +- gui/ui_files/irodsLogin.py | 2 +- gui/ui_files/searchDialog.py | 2 +- gui/ui_files/tabBrowser.py | 6 ++- gui/ui_files/tabDataCompression.py | 2 +- gui/ui_files/tabELNData.py | 2 +- gui/ui_files/tabFederations.py | 2 +- gui/ui_files/tabInfo.py | 2 +- gui/ui_files/tabPage.py | 2 +- gui/ui_files/tabTicketAccess.py | 8 ++-- gui/ui_files/tabTicketCreate.py | 2 +- gui/ui_files/tabUpDownload.py | 9 ++-- {gui/icons => icons}/arrow-left.png | Bin {gui/icons => icons}/arrow-right.png | Bin {gui/icons => icons}/home.png | Bin {gui/icons => icons}/irods-basicGUI_Login.png | Bin {gui/icons => icons}/loading_circle.gif | Bin {gui/icons => icons}/nosync.png | Bin {gui/icons => icons}/syncing.png | Bin pyinstaller_script.py | 43 +++++++++++++----- 25 files changed, 69 insertions(+), 33 deletions(-) create mode 100644 gui/ui_files/icons.py rename {gui/icons => icons}/arrow-left.png (100%) rename {gui/icons => icons}/arrow-right.png (100%) rename {gui/icons => icons}/home.png (100%) rename {gui/icons => icons}/irods-basicGUI_Login.png (100%) rename {gui/icons => icons}/loading_circle.gif (100%) rename {gui/icons => icons}/nosync.png (100%) rename {gui/icons => icons}/syncing.png (100%) diff --git a/gui/ui_files/MainMenu.py b/gui/ui_files/MainMenu.py index cc330eb..6d78006 100644 --- a/gui/ui_files/MainMenu.py +++ b/gui/ui_files/MainMenu.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\MainMenu.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\MainMenu.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/__pycache__.py b/gui/ui_files/__pycache__.py index def971c..2b5b74d 100644 --- a/gui/ui_files/__pycache__.py +++ b/gui/ui_files/__pycache__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\__pycache__' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\__pycache__' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/createCollection.py b/gui/ui_files/createCollection.py index 32b12b0..3ae10c7 100644 --- a/gui/ui_files/createCollection.py +++ b/gui/ui_files/createCollection.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\createCollection.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\createCollection.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/dataTransferState.py b/gui/ui_files/dataTransferState.py index 7d2211e..4eb9ff0 100644 --- a/gui/ui_files/dataTransferState.py +++ b/gui/ui_files/dataTransferState.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\dataTransferState.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\dataTransferState.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/icons.py b/gui/ui_files/icons.py new file mode 100644 index 0000000..855bc26 --- /dev/null +++ b/gui/ui_files/icons.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\icons' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + diff --git a/gui/ui_files/irodsIndexPopup.py b/gui/ui_files/irodsIndexPopup.py index e58f084..fc947a5 100644 --- a/gui/ui_files/irodsIndexPopup.py +++ b/gui/ui_files/irodsIndexPopup.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\irodsIndexPopup.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\irodsIndexPopup.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/irodsLogin.py b/gui/ui_files/irodsLogin.py index ef29b93..b37abdd 100644 --- a/gui/ui_files/irodsLogin.py +++ b/gui/ui_files/irodsLogin.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\irodsLogin.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\irodsLogin.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/searchDialog.py b/gui/ui_files/searchDialog.py index f483285..dbc1a8c 100644 --- a/gui/ui_files/searchDialog.py +++ b/gui/ui_files/searchDialog.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\searchDialog.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\searchDialog.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/tabBrowser.py b/gui/ui_files/tabBrowser.py index 273e3dd..62b6ac3 100644 --- a/gui/ui_files/tabBrowser.py +++ b/gui/ui_files/tabBrowser.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabBrowser.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabBrowser.ui' # # Created by: PyQt5 UI code generator 5.15.4 # @@ -8,6 +8,8 @@ # run again. Do not edit this file unless you know what you are doing. +from os.path import dirname, realpath +from sys import argv from PyQt5 import QtCore, QtGui, QtWidgets @@ -76,7 +78,7 @@ class Ui_tabBrowser(object): self.homeButton = QtWidgets.QPushButton(tabBrowser) self.homeButton.setText("") icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap("D:\\irods-clients\\gui\\ui_files\\../icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon.addPixmap(QtGui.QPixmap(dirname(realpath(argv[0])) + "/icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.homeButton.setIcon(icon) self.homeButton.setObjectName("homeButton") self.gridLayout.addWidget(self.homeButton, 0, 2, 1, 1) diff --git a/gui/ui_files/tabDataCompression.py b/gui/ui_files/tabDataCompression.py index 5f984e9..13a494e 100644 --- a/gui/ui_files/tabDataCompression.py +++ b/gui/ui_files/tabDataCompression.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabDataCompression.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabDataCompression.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/tabELNData.py b/gui/ui_files/tabELNData.py index bbe273b..451a596 100644 --- a/gui/ui_files/tabELNData.py +++ b/gui/ui_files/tabELNData.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabELNData.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabELNData.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/tabFederations.py b/gui/ui_files/tabFederations.py index c48c08f..58e8717 100644 --- a/gui/ui_files/tabFederations.py +++ b/gui/ui_files/tabFederations.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabFederations.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabFederations.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/tabInfo.py b/gui/ui_files/tabInfo.py index 663ea0c..ca36e7c 100644 --- a/gui/ui_files/tabInfo.py +++ b/gui/ui_files/tabInfo.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabInfo.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabInfo.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/tabPage.py b/gui/ui_files/tabPage.py index 818d860..933b5c2 100644 --- a/gui/ui_files/tabPage.py +++ b/gui/ui_files/tabPage.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabPage.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabPage.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/tabTicketAccess.py b/gui/ui_files/tabTicketAccess.py index 2dc02a9..2335515 100644 --- a/gui/ui_files/tabTicketAccess.py +++ b/gui/ui_files/tabTicketAccess.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabTicketAccess.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabTicketAccess.ui' # # Created by: PyQt5 UI code generator 5.15.4 # @@ -8,6 +8,8 @@ # run again. Do not edit this file unless you know what you are doing. +from os.path import dirname, realpath +from sys import argv from PyQt5 import QtCore, QtGui, QtWidgets @@ -92,7 +94,7 @@ class Ui_tabTicketAccess(object): self.homeButton = QtWidgets.QPushButton(tabTicketAccess) self.homeButton.setText("") icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap("D:\\irods-clients\\gui\\ui_files\\../icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon.addPixmap(QtGui.QPixmap(dirname(realpath(argv[0])) + "/icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.homeButton.setIcon(icon) self.homeButton.setObjectName("homeButton") self.horizontalLayout_5.addWidget(self.homeButton) @@ -129,7 +131,7 @@ class Ui_tabTicketAccess(object): self.downloadButton = QtWidgets.QPushButton(tabTicketAccess) self.downloadButton.setText("") icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap("D:\\irods-clients\\gui\\ui_files\\../icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon1.addPixmap(QtGui.QPixmap(dirname(realpath(argv[0])) + "/icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.downloadButton.setIcon(icon1) self.downloadButton.setIconSize(QtCore.QSize(30, 30)) self.downloadButton.setObjectName("downloadButton") diff --git a/gui/ui_files/tabTicketCreate.py b/gui/ui_files/tabTicketCreate.py index 61095b9..d8ef0dc 100644 --- a/gui/ui_files/tabTicketCreate.py +++ b/gui/ui_files/tabTicketCreate.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabTicketCreate.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabTicketCreate.ui' # # Created by: PyQt5 UI code generator 5.15.4 # diff --git a/gui/ui_files/tabUpDownload.py b/gui/ui_files/tabUpDownload.py index 7c61871..570fd10 100644 --- a/gui/ui_files/tabUpDownload.py +++ b/gui/ui_files/tabUpDownload.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabUpDownload.ui' +# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabUpDownload.ui' # # Created by: PyQt5 UI code generator 5.15.4 # @@ -8,6 +8,8 @@ # run again. Do not edit this file unless you know what you are doing. +from os.path import dirname, realpath +from sys import argv from PyQt5 import QtCore, QtGui, QtWidgets @@ -131,7 +133,8 @@ class Ui_tabUpDownload(object): self.UploadButton.setMinimumSize(QtCore.QSize(100, 0)) self.UploadButton.setText("") icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap("D:\\irods-clients\\gui\\ui_files\\../icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + print(dirname(realpath(argv[0])) + "/icons/arrow-right.png") + icon.addPixmap(QtGui.QPixmap(dirname(realpath(argv[0])) + "/icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.UploadButton.setIcon(icon) self.UploadButton.setIconSize(QtCore.QSize(50, 50)) self.UploadButton.setObjectName("UploadButton") @@ -145,7 +148,7 @@ class Ui_tabUpDownload(object): self.DownloadButton.setMinimumSize(QtCore.QSize(100, 0)) self.DownloadButton.setText("") icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap("D:\\irods-clients\\gui\\ui_files\\../icons/arrow-left.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon1.addPixmap(QtGui.QPixmap(dirname(realpath(argv[0])) + "/icons/arrow-left.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.DownloadButton.setIcon(icon1) self.DownloadButton.setIconSize(QtCore.QSize(50, 50)) self.DownloadButton.setObjectName("DownloadButton") diff --git a/gui/icons/arrow-left.png b/icons/arrow-left.png similarity index 100% rename from gui/icons/arrow-left.png rename to icons/arrow-left.png diff --git a/gui/icons/arrow-right.png b/icons/arrow-right.png similarity index 100% rename from gui/icons/arrow-right.png rename to icons/arrow-right.png diff --git a/gui/icons/home.png b/icons/home.png similarity index 100% rename from gui/icons/home.png rename to icons/home.png diff --git a/gui/icons/irods-basicGUI_Login.png b/icons/irods-basicGUI_Login.png similarity index 100% rename from gui/icons/irods-basicGUI_Login.png rename to icons/irods-basicGUI_Login.png diff --git a/gui/icons/loading_circle.gif b/icons/loading_circle.gif similarity index 100% rename from gui/icons/loading_circle.gif rename to icons/loading_circle.gif diff --git a/gui/icons/nosync.png b/icons/nosync.png similarity index 100% rename from gui/icons/nosync.png rename to icons/nosync.png diff --git a/gui/icons/syncing.png b/icons/syncing.png similarity index 100% rename from gui/icons/syncing.png rename to icons/syncing.png diff --git a/pyinstaller_script.py b/pyinstaller_script.py index 269bfd8..c6be3ac 100644 --- a/pyinstaller_script.py +++ b/pyinstaller_script.py @@ -28,6 +28,26 @@ def ui_to_py(ui_folder): print(f"Converting {filename} to .py") run_cmd(f"""python -m PyQt5.uic.pyuic -x {ui_file} -o {filename +".py"}""") + # Find and replace the pixelmap references... They are hardcoded + with open(filename +".py") as file: + lines = file.readlines() + modified_lines = {} + for linenum, line in enumerate(lines): + if """QtGui.QPixmap(\"""" in line: + abs_fchar = line.find("\"") + abs_lchar = line.find(".", abs_fchar) + 2 + + new_line = line[0:abs_fchar] + "dirname(realpath(argv[0])) + \"" + line[abs_lchar:] + modified_lines[linenum] = new_line + + if len(modified_lines) > 0: + for linenum, text in modified_lines.items(): + lines[(linenum)] = text + lines.insert(10, "from sys import argv\n") + lines.insert(10, "from os.path import dirname, realpath\n") + with open(filename +".py", 'w') as file: + file.writelines(lines) + # Remove the locally stored .py versions of the files def remove_pyui_files(ui_folder): @@ -46,7 +66,7 @@ def replace_folder(source, destination): if __name__ == "__main__": - icons_folder = f"{getcwd()}{sep}gui{sep}icons{sep}" + icons_folder = f"{getcwd()}{sep}icons" ui_folder = f"{getcwd()}{sep}gui{sep}ui_files{sep}" rules_folder = f"{getcwd()}{sep}rules" venv = f"{getcwd()}{sep}venv" @@ -57,23 +77,28 @@ if __name__ == "__main__": else: # Linux cmd_sep = ";" - # Step 1: Pyinstallers includes all dependencies in the environment, so we use a venv - # Step 1a, Ensure the folder for the venv exists + # Step 1 Convert .ui files to .py files + # Remove py files if they already exist, recompiling is the best way to ensure they are up to date + remove_pyui_files(ui_folder) + ui_to_py(ui_folder) + + # Step 2: Pyinstallers includes all dependencies in the environment, so we use a venv + # Step 2a, Ensure the folder for the venv exists if (not path.exists(venv)) or (not path.isdir(venv)): mkdir(venv) - # Step 1b, Create the venv if needed + # Step 2b, Create the venv if needed venv_activate = venv + f"{sep}Scripts{sep}activate.bat" if (not path.exists(venv_activate)) or (not path.isfile(venv_activate)): run_cmd(f"python -m venv {venv}") run_cmd(f"{venv_activate} {cmd_sep} pip install -r requirements.txt") - # Step 2, Activate venv and tun pyinstaller + # Step 3, Activate venv and tun pyinstaller run_cmd(f"{venv_activate} {cmd_sep} pyinstaller -F --clean {getcwd()}{sep}irods-iBridgesGui.py") dist_folder = f"{getcwd()}{sep}dist" - # Step 3, Copy rules, icons folder to dist folder, replace if exists. + # Step 4, Copy rules, icons folder to dist folder, replace if exists. dist_icons = f"{dist_folder}{sep}icons" dist_rules = f"{dist_folder}{sep}rules" replace_folder(icons_folder, dist_icons) @@ -81,12 +106,6 @@ if __name__ == "__main__": - # Step 5 Convert .ui files to .py files - # Remove py files if they already exist, recompiling is the best way to ensure they are up to date - remove_pyui_files(ui_folder) - ui_to_py(ui_folder) - - confirmation = input("Do you want to cleanup the build environment (Y/N): ") if confirmation[0].upper() == 'Y': #remove_pyui_files(ui_folder) -- GitLab