Python 导入在从我自己的文件导入时返回 ModuleNotFoundError

问题描述 投票:0回答:1

我有一个非常简单的情况:我正在使用 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 库一起工作就好了。

python import pyqt
1个回答
0
投票

首先,这取决于您如何构建项目。然后尝试从您的工作目录开始指定导入的绝对路径。

例如,考虑项目结构:

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
© www.soinside.com 2019 - 2024. All rights reserved.