我正在将我的 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
是我的应用程序的包,有一个用于 UI 特定代码的子包,my_qt_tool.py
包含运行 GUI 的"主"代码,class1.py
处理业务逻辑,wizard1.py
只是 GUI 向导的一些额外类。
Q1:此项目结构是否规范?主要功能是否在应有的位置?应该将 *.ui 文件分隔到resources
吗?
现在,经过一些与导入讨价还价之后,我将my_qt_tool
作为源目录添加到 pycharm 以使导入正常工作,并使用工作目录MyProj/my_qt_tool
创建了my_qt_tool.py
运行。
Q2:从技术上讲,我希望工作目录是MyProj
的,但是我将不得不用my_qt_tool/resources..
引用resources/templates/tool.conf.template
,这似乎很糟糕......还是
这样做的方法?现在,my_qt_tool
中的导入如下所示:
from class1 import DataModel
from ui.mainwindow import Ui_MainWindow
...
所以没有相对进口之类的,因为所有东西都在同一个包装中,对吧?(再次:为了完成这项工作,我不得不在我的 PyCharm 项目设置中添加my_qt_tool
作为源目录......
Q3:好的,现在不起作用的东西。在规范文件上运行 PyInstaller,该文件几乎与Analysis(['my_qt_tool/my_qt_tool.py'], ...
一起,生成的二进制文件无法启动,并显示错误消息:ModuleNotFoundError: No Module named 'class1'
。我该如何解决这个问题?
Q1
如果项目要变大,您可以创建特定于模块的文件夹,每个模块都有 PY 和 GUI 文件。 将其构建为 MVC 项目文件夹。 对于 mvc 的文件夹结构:https://www.tutorialsteacher.com/mvc/mvc-folder-structure 这里和这里是 hov 模型视图架构可以在 https://www.learnpyqt.com/courses/model-views/modelview-architecture/实现。
第 2 季度
在应用程序引导时读取资源/模板/工具.conf.模板,而不是静态引用。 这可以generate_ui_code.py完成,以将所有配置作为应用程序参考的一部分加载
所以没有相对进口之类的,因为所有东西都在同一个包装中,对吧?(再次:为了完成这项工作,我不得不在我的 PyCharm 项目设置中添加my_qt_tool作为源目录......
如果正确引导,则无需添加my_qt_tool
第三季度
将这 2 行添加到等级库文件的顶部
import sys
sys.setrecursionlimit(5000)
如果您仍然遇到与 Class1 相关的问题,请尝试将其导入到为您的案例调用 pyinstaller 的地方,其my_qt_tool.py
首先修复 pyinstaller 问题,然后考虑使用模型视图约定重构文件夹结构。
以下是一些相当大的项目示例
- https://wiki.python.org/moin/PyQt/SomeExistingApplications
- https://github.com/topics/pyqt5-desktop-application