Python 在PyQt5中导入模块

Python 在PyQt5中导入模块,python,import,module,pyqt5,Python,Import,Module,Pyqt5,在一个使用不同模块的QMainWindow中添加带有PyQt5的小部件时,我遇到了一些问题。基本上,我的GUI有很多窗口和小部件,我认为使用不同的模块会更有条理。但是,当我尝试将一个小部件从一个模块添加到主模块时,它会给我一个错误,就像我尝试导入的类没有定义一样 为了简化,下面有一个非常简单的测试,我尝试了,但得到了与我的GUI脚本相同的错误。我有两个模块,一个叫做main_gui_文件,另一个叫做widget_文件 本例中的主gui文件是我在屏幕中加载的QMainWindow,我想在我的sel

在一个使用不同模块的QMainWindow中添加带有PyQt5的小部件时,我遇到了一些问题。基本上,我的GUI有很多窗口和小部件,我认为使用不同的模块会更有条理。但是,当我尝试将一个小部件从一个模块添加到主模块时,它会给我一个错误,就像我尝试导入的类没有定义一样

为了简化,下面有一个非常简单的测试,我尝试了,但得到了与我的GUI脚本相同的错误。我有两个模块,一个叫做main_gui_文件,另一个叫做widget_文件

本例中的主gui文件是我在屏幕中加载的QMainWindow,我想在我的self.grid\u 01中添加一个小部件,调用模块小部件文件中的函数

当我运行这个测试时,它给了我NameError:name“Add\u Widgets”没有定义

下面是两个测试模块

主图形用户界面文件

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

from teste.widget_file import *

class Main_GUI(QMainWindow):

    def __init__(self, *args, **kwargs):

        super(Main_GUI, self).__init__(*args, **kwargs)

        self.setGeometry(0, 0, 500, 500)

        self.main_widget = QStackedWidget()
        self.setCentralWidget(self.main_widget)

        self.widget_01 = QWidget()
        self.main_widget.addWidget(self.widget_01)
        self.grid_01 = QGridLayout()
        self.widget_01.setLayout(self.grid_01)
        self.main_widget.setCurrentWidget(self.widget_01)

        self.label1 = QLabel('a')
        self.label2 = QLabel('b')
        self.grid_01.addWidget(self.label1, 0, 0)
        self.grid_01.addWidget(self.label2, 1, 0)

        self.add_widgets = Add_Widgets()
        self.add_widgets.add_widget()

app = QApplication(sys.argv)
window = Main_GUI()

window.show()
app.exec_()
小部件文件

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

from teste.main_gui_file import *

class Add_Widgets(QMainWindow):

    def __init__(self, *args, **kwargs):

        super(Add_Widgets, self).__init__(*args, **kwargs)
        self.main_gui = Main_GUI()

    def add_widget(self):

        self.label3 = QLabel('c')
        self.main_gui.grid_01.addWidget(self.label3, 3, 0)
有人知道为什么我在导入模块时会遇到这样的麻烦吗?
谢谢

首先,请确保模块目录中有文件uuu init_uuuu.py。其次,从您的示例中,您尝试导入放置在同一目录中的两个文件。因此,尝试导入相对路径,from teste.widget\u file import*将来自.widget\u file import*,from teste.main\u gui\u file import*将来自.main\u gui\u file import*

编辑:

为了避免循环导入,我建议将代码更改为

from PyQt5.QtCore import QObject

class Add_Widgets(QObject):

    def __init__(self, parent, *args, **kwargs):
        super(Add_Widgets, self).__init__(*args, **kwargs)
        self.main_gui = parent

    ...
因此,您可以通过以下方式创建Add_小部件实例:

class Main_GUI(QMainWindow):

    def __init__(self, *args, **kwargs):

        super(Main_GUI, self).__init__(*args, **kwargs)

        ...

        self.add_widgets = Add_Widgets(self)

代码中最重要的问题是,您正在执行循环导入,这通常是不好的

在一般术语中,这意味着在发生某些事情之前,它不会进一步处理代码

这几乎就是正在发生的事情:

主gui文件被加载,并在某个点尝试从小部件文件导入 正在导入widget_文件并尝试从主_gui_文件加载 主gui文件再次被处理,但它试图随之进行简单的循环导入并不是一个真正的问题,因为Python可以管理它们,但在这一点上,在主gui文件完成之前,小部件文件不会被完全导入 从widget_文件导入的主_gui_文件正在尝试完成加载 导入的main_gui_文件还尝试创建main_gui的实例,这反过来需要Add_Widgets,它存在于widget_文件中,但此时尚未加载,因为导入处理仍被试图完成main_gui_文件的加载所占用 Python对您大喊大叫,因为还不存在Add_小部件 但这还不够

除此之外还有一个逻辑问题,部分原因是:您试图在Add_Widgets类中创建一个新的Main_GUI实例,这没有多大意义,因为已经存在一个实例,而该实例就是您要将小部件添加到的实例

此外,出于同样的原因,如果您想将小部件添加到现有实例中,您确实不应该创建一个新的QMainWindow,因为您实际上不打算使用它

从您的代码中,我真的不明白为什么您需要另一个文件来完成所有可能有充分理由的工作,但您的代码没有显示任何原因,但我同意它,并建议进行以下修改:

main_gui_file.py:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys

from widget_file import *

class Main_GUI(QMainWindow):

    def __init__(self, *args, **kwargs):
        # ...
        add_widget(self, self.grid_01)

但只要您在widget_file.py中返回添加的小部件:

from PyQt5.QtWidgets import *

def add_widget(parent, layout): # <-- note that there's no "self"
    parent.label3 = QLabel('c')
    layout.addWidget(parent.label3, 3, 0)

请注意,这并不是一种非常优雅的方法,因为像这样的单独导入通常是为公共函数完成的。util函数通常是为不需要实例参数的公共任务调用的,并且,在处理此类对象时,每当导入的对象是要为其创建实例的类时,通常都会执行此操作,但这确实是一个完全不同的问题。

请完成我的问题。。。两个文件都在同一文件夹中您是否意识到您正在执行循环导入?在同一示例中,我尝试仅从主小部件导入,并在小部件函数中使用参数,但效果不理想我编辑了我的问题并更改了ciclic导入两个模块中的初始化函数。。。我改为相对路径,但出现了错误ImportError:尝试在没有已知父包的情况下进行相对导入我猜这是因为循环import@NaufanRusydaFaikar这与_init__u;.py无关,但与QApplication.exec阻塞的事实有关,这会阻止循环导入完成。我编辑了我的问题并更改了ciclic导入,但仍然无法工作名称错误:名称“Main\u GUI”未定义请不要编辑您的问题,如果它不能解决您的问题,特别是如果编辑删除了代码的主要问题,并引入了其他不同的问题。感谢您的解释。。。现在我明白了
# ...
class Main_GUI(QMainWindow):
    def __init__(self, *args, **kwargs):
        # ...
        self.label3 = add_widget(self.grid_01)
from PyQt5.QtWidgets import *

def add_widget(layout):
    label = QLabel('c')
    layout.addWidget(label, 3, 0)
    return label