Я нахожусь в процессе структурирования моего приложения PyQt5 в соответствии с более установленными соглашениями. Теперь это выглядит так:
MyProj
├── my_qt_tool
│ ├── __init__.py
│ ├── class1.py
│ ├── my_qt_tool.py
│ ├── wizard1.py
│ ├── resources
│ │ └── templates
│ │ └── tool.conf.template
│ └── ui
│ ├── __init__.py
│ ├── mainwindow.py
│ ├── mainwindow.ui
│ ├── wizard_01_start.py
│ ├── wizard_01_start.ui
│ ├── ...
├── my_qt_tool.spec # for PyInstaller
├── bin
│ └── generate_ui_code.py # for compiling Qt *.ui to *.py
├── dist
│ └── my_qt_tool
├── environment.yml # conda environment requirements.
├── LICENSE
└── README.md
Итак, MyProj
- это git-репозиторий верхнего уровня, my_qt_tool
- это пакет моего приложения с подпакетом для кода, специфичного для пользовательского интерфейса, my_qt_tool.py
содержит "main »код, который запускает GUI, class1.py
обрабатывает бизнес-логику, а wizard1.py
- это просто дополнительный класс для мастера GUI.
Q1: Является ли эта структура проекта канонической? Главная функция, где она должна быть? Должны ли файлы * .ui быть разделены на resources
?
Теперь, после некоторого торга с импортом, я добавил my_qt_tool
в качестве исходного каталога в pycharm, чтобы импорт работал, и создал прогон для my_qt_tool.py
срабочий каталог MyProj/my_qt_tool
.
Q2: Технически, я хочу, чтобы рабочий каталог был MyProj
, но тогда мне нужно было бы сослаться на resources/templates/tool.conf.template
с my_qt_tool/resources..
, что кажется отвратительным ... илиэто способ сделать это?
Теперь импорт в my_qt_tool
выглядит следующим образом:
from class1 import DataModel
from ui.mainwindow import Ui_MainWindow
...
, поэтому нет относительного импорта или тому подобного, потому что все в одной упаковке, верно? (Опять же: чтобы это работало, мне пришлось добавить my_qt_tool
в качестве исходного каталога в настройках моего проекта PyCharm ...)
Q3: Хорошо, теперь это не работает. При запуске PyInstaller в файле спецификации, который в значительной степени содержит Analysis(['my_qt_tool/my_qt_tool.py'], ...
, полученный двоичный файл не запускается с сообщением об ошибке: ModuleNotFoundError: No Module named 'class1'
. Как я могу это исправить?