我有一个非常简单的情况:我正在使用 python 和 PyQt6 开发一个项目,我希望我的自定义小部件和窗口类位于单独的文件中。现在我有 2 个文件,1 个用于自定义小部件,1 个用于自定义窗口。我想将我的自定义小部件类导入到包含 Windows 相关类的文件中,但它因 ModuleNotFoundError 而失败。
供参考:
CustomWidgets.py
from PyQt6.QtWidgets import QLineEdit, QLabel, QWidget, QVBoxLayout, QHBoxLayout, QSpinBox, QDoubleSpinBox, QSlider
class SliderSpinBox(QWidget):
def __init__(self, *args, **kwargs):
super(SliderSpinBox, self).__init__(*args, **kwargs)
self.layout = QHBoxLayout()
self.spinbox = QDoubleSpinBox()
self.trackbar = QSlider()
self.layout.addWidget(self.spinbox)
self.layout.addWidget(self.trackbar)
self.setLayout(self.layout)
主窗口.py
#PyQt6 imports
...
from CustomWidgets import SliderSpinBox
#classes
...
错误:ModuleNotFoundError:没有名为“CustomWidgets”的模块 你知道我做的有什么问题吗?
我尝试为不同的 Windows 类制作不同的文件。当我试图从另一个文件导入 1 个类时,同样的事情发生了。导入与 PyQt6 和 opencv 库一起工作就好了。
首先,这取决于您如何构建项目。然后尝试从您的工作目录开始指定导入的绝对路径。
例如,考虑项目结构:
YourWorkingDir/
│
├── MainPackage/
│ ├── __init__.py
│ │
│ ├── CustomWidgetsPackage/
│ │ ├── __init__.py
│ │ ├── slider_spinbox.py
│ │ └── some_other_custom_widget.py
│ │
│ └── MyWindows/
│ ├── __init__.py
│ ├── main_window.py
│ └── some_other_window.py
│
│
└── main.py
在
SliderSpinBox
中定义您的
slider_spinbox.py
小部件
# /YourWorkingDir/MainPackage/CustomWidgetsPackage/slider_spinbox.py
from PyQt6.QtWidgets import QLineEdit, QLabel, QWidget, QVBoxLayout, QHBoxLayout, QSpinBox, QDoubleSpinBox, QSlider
class SliderSpinBox(QWidget):
def __init__(self, *args, **kwargs):
super(SliderSpinBox, self).__init__(*args, **kwargs)
self.layout = QHBoxLayout()
self.spinbox = QDoubleSpinBox()
self.trackbar = QSlider()
self.layout.addWidget(self.spinbox)
self.layout.addWidget(self.trackbar)
self.setLayout(self.layout)
main_window.py
应该是:
# /YourWorkingDir/MainPackage/MyWindows/main_window.py
# PyQt6 imports
from PyQt6.QtWidgets import QMainWindow
from MainPackage.CustomWidgetsPackage.slider_spinbox import SliderSpinBox
# classes
class MainWindow(QMainWindow):
...
然后在您的
main.py
文件中:
# PyQt6 imports
from PyQt6.QtWidgets import QApplication
from MainPackage.MyWindows.main_window import MainWindow
# other imports
import sys
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec())
同样适用于更深层次的嵌套包和模块。
旁白:
我们也可以使用相对导入:在
__init__.py
的CustomWidgetsPackage
我们可以指定:
from .. CustomWidgets.slider_spinbox import SliderSpinBox
# each dot represent a level starting from the root directory
在
main_window.py
文件中,我们可以将 SliderSpinBox
导入为:
from MainPackage.CustomWidgetsPackage import SliderSpinBox