Я пытаюсь создать приложение с графическим интерфейсом PyQt5. У меня установлены python3.6 и pyqt5 на Centos-8. Структура каталогов следующая:
Workspace/
├── app.py
├── Controller
├── Model
└── View
├── ContentLayout
│ ├── UserActions
│ │ └── ButtonLayout.py
│ └── UserInput
│ └── TextInputLayout.py
├── FooterLayout
├── HeaderLayout
├── mainMenu.py
app.py:
# This is main application
from View.mainMenu import MenuDesign
if __name__ == "__main__":
test = MenuDesign()
test.genereateLayout()
mainMenu.py:
from ContentLayout.UserInput.TextInputLayout import TextInput
from PyQt5.QtWidgets import QMainWindow
class MenuDesign(QMainWindow):
def __init__(self):
super().__init__()
pass
def genereateLayout(self):
self.userinput = TextInput()
self.userinput.initialize_label()
self.userinput.initialize_textinput()
print("Function called from TextInputLayout")
TextInputLayout.py:
# This is class for designing layouts for text input boxes and status bar.
class TextInput:
"""This is main class for user inputs."""
def __init__():
pass
def initialize_label(self):
print("Function is printing from TextInputLayout")
pass
def initialize_textinput(self):
print("Function is printing textinput from TextInputLayout")
pass
Когда я запускаю приложение, я получаю следующую ошибку:
Traceback (most recent call last):
File "app.py", line 1, in <module>
from View.mainMenu import MenuDesign
File "/home/amarjeets/Workspace/View/mainMenu.py", line 2, in <module>
from ContentLayout.UserInput.TextInputLayout import TextInput
ModuleNotFoundError: No module named 'ContentLayout'
Я попытался поместить файл __init__.py
в папки View
, ContentLayout
и UserInput
со всеми перестановками/комбинациями по-прежнему с той же ошибкой.
Есть ли какое-либо правило или общее руководство, которому я должен следовать, чтобы импортировать модуль/класс/функцию в python данной структуры папки/файла проекта, такой как моя?
И
Если у меня также есть файл, т.е. consolidatedLayout.py
в папке ContentLayout со всеми остальными файлами, то как импортировать модули из ButtonLayout.py
или TextInputLayout.py
в consolidatedLayout.py
@HampusLarsson Сэр .. Я тоже проверил это ... та же ошибка. Я даже поставил __init__.py
всем папкам все равно такая же ошибка.
У меня есть следующая структура папок:
C:.
│ app.py
│ __init__.py
│
└───View
│ MainScript.py
│ __init__.py
│
└───Folder1
sub1.py
__init__.py
app.py
:
from View.MainScript import Test
print(Test.x)
Test.p()
MainScript.py
:
from View.Folder1.sub1 import printIt
class Test:
x = 123
p = printIt
sub1.py
:
def printIt():
print("printed inside of sub1.py")
Когда я запускаю app.py
это вывод:
123
printed inside of sub1.py
Обратите внимание, что импорт внутри MainScript
— это from View.Folder1.sub1 import printIt
, где View
— это папка «выше», которая считается module
, из которой вы импортируете.
Спасибо за ответ. Итак, мне нужно импортировать модули из корневого пути (где запускается основной поток, например, app.py), или мне нужно импортировать только из одной папки выше?
Вы должны думать о структуре папок как о модуле, и вам нужно указать «путь» к файлам, которые вы хотите импортировать. Так что да, вы должны смотреть на это так, как будто ваши файлы импортируются из «корневой» папки.
Я думаю, что у вас должен быть
__init__.py
внутри папкиapp.py
, чтобы он работал.