@lobster5

Как решить следующую проблему с созданием exe файла из ру и ui файлов?

Здравствуйте,
такая задача: имеется один start.py файл, который решает, какой из двух .ру открыть дальше; эти два main_gui.ру и main_gui2.py файла практически идентичны, основное отличие, что они привязаны к разным .ui файлам (на разных языках открывают GUI), также они привязаны к ещё нескольким вспомогательным .ру файлам.

Как можно сделать из этого .ехе файл рабочий? (много чего перепробовал). И почему, если для открытия использую os.system('python main_gui(2).py') - до создания .exe всё работает прекрасно, а когда использую import main_gui(2) - вроде бы импортирует всё, но соответствующий интерфейс не открывает?

Заранее спасибо
  • Вопрос задан
  • 132 просмотра
Решения вопроса 1
@DollaR84
При создании exe файла, такой путь:
os.system('python main_gui(2).py')

вообще не годится, он же будет запускаться только на компьютере с установленным python.
а насчет:
до создания .exe всё работает прекрасно, а когда использую import main_gui(2) - вроде бы импортирует всё, но соответствующий интерфейс не открывает?

если вы используете pyinstaller для создания exe с флагом -F для создания одного exe файла, с запакованным в него содержимым, то для добавления прочих данных, таких как ui файлы, надо добавить их в параметры pyinstaller. Используется параметр --add-data, и состоит из двух значений, имени добавляемого файла и пути к нему, разделяемые знаком ";".например, если файл называется gui1.ui и лежит в той же директории рядом со скриптом, то параметры pyinstaller будут выглядеть примерно так:
pyinstaller -F --add-data gui1.ui;. start.py
Точка означает текущий каталог.

UPDATE
Вам надо в файл, загружающий данные ui файлы добавить следующий код:
import os
import sys
def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    if getattr(sys, 'frozen', False):
        base_path = sys._MEIPASS
    else:
        base_path = os.getcwd()
    return os.path.join(base_path, relative_path)

Дальше надо производить поиск файлов через данную функцию.
Например, в вашем случае следующим образом:
main_window = uic.loadUiType(resource_path('gui.ui')))[0]
class Window(QMainWindow, main_window):
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы