#python-3.x #pyqt5 #centos8
#python-3.x #pyqt5 #centos8
Вопрос:
Я пытаюсь создать приложение с графическим интерфейсом 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
Комментарии:
1. Я думаю, что у вас также должна быть
__init__.py
внутренняя часть папкиapp.py
, чтобы она работала.2. @HampusLarsson сэр .. я тоже проверил это … та же ошибка. Я даже поместил
__init__.py
во все папки ту же ошибку.
Ответ №1:
У меня следующая структура папок:
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
, из которой вы импортируете.
Комментарии:
1. Спасибо за ответ. Поэтому я должен импортировать модули из корневого пути (где запускается основной поток, т. е. app.py ) или мне нужно импортировать только из одной папки выше?
2. Вы должны думать о структуре папок как о самом модуле, и вы должны указать «путь» к файлам, которые вы хотите импортировать. Так что да, вы должны смотреть на это так, как будто ваши файлы импортируются из «корневой» папки.