Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt代码拆分-设计与功能_Python_Qt_Class_Inheritance_Pyqt - Fatal编程技术网

Python PyQt代码拆分-设计与功能

Python PyQt代码拆分-设计与功能,python,qt,class,inheritance,pyqt,Python,Qt,Class,Inheritance,Pyqt,我正在努力理解如何在(Py)Qt中拆分代码。其目的是在QMainWindow中设置设计和导航选项卡,每个选项卡触发其他文件中的代码。到目前为止,它仅在同一文档中启动ActionClass/在单击选项卡时放入外部文档会导致“应用程序未定义”。下面的代码没有错误,但很笨重 class Main(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.u = Ui_MainWindow

我正在努力理解如何在(Py)Qt中拆分代码。其目的是在QMainWindow中设置设计和导航选项卡,每个选项卡触发其他文件中的代码。到目前为止,它仅在同一文档中启动ActionClass/在单击选项卡时放入外部文档会导致“应用程序未定义”。下面的代码没有错误,但很笨重

class Main(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.u = Ui_MainWindow()
        self.u.setupUi(self)

        self.u.tabs.currentChanged.connect(self.TabsChanged)

    def TabsChanged(self, i):
        if i == self.u.tabs.indexOf(self.u.tabFirst): ActionClass.__init__


class ActionClass(Main):
    def __init__(self):
        app.u.lineEdit.setText("test")

app = Main()
app.show()
sys.exit(app.exec_())
我一直看到的示例都包含在一个文档中。是否有其他方法来执行此操作,例如ActionClass位于另一个文件中/编写u.lineEdit.setText而不是app.u.lineEdit.setText。似乎继承&无法从ActionClasses文档访问Main的实例,所以我看不出它们将如何通信回Main


非常感谢@M4rtini所建议的,您可以将您的代码分为多个部分。然后在主模块中导入(使用它们)

例如,您发布的代码可以在以下文件中分离:

# actions_class.py

class ActionClass(Main):
    def __init__(self):
        app.u.lineEdit.setText("test")

要了解导入的工作原理,请参阅我在上面给您留下的链接

更多解释

让我们看看:

\uuu init\uu
方法中执行代码的正确方法是创建实例。请参见下面的示例

class A:
    def __init__(self):
        print("Executing A.__init__")

print("Doing things wrong")
A.__init__     # This don't print enything
print("Doing things well")
A()            # This works as expected.
所以,你的台词是:

if i == self.u.tabs.indexOf(self.u.tabFirst): ActionClass.__init__
并应为:

if i == self.u.tabs.indexOf(self.u.tabFirst): ActionClass()
另一方面,在
\uuuu init\uuu
方法中放置不用于初始化实例的代码是一种错误的做法。 如果不需要实例,但是希望将函数存储在类(类C++命名空间)中 使用
@staticmethod
装饰器

class A:

    @staticmethod
    def foo():
        print("Oh, wow, a static method in Python!")

A.foo()
因此,您的
ActionClass
可以重写为:

class ActionClass(Main):

    @staticmethod
    def do_action:
        app.u.lineEdit.setText("test")
ans然后您可以这样使用它:

 if i == self.u.tabs.indexOf(self.u.tabFirst): ActionClass.do_action()

你不能只是把东西放在不同的文件里,期望他们自动地相互了解。您需要将它们导入到运行的主文件中。这不是一个特定的pyqt问题。但是一个普遍的python问题。非常感谢你的评论。导入语句包含在两个文档的顶部,但在尝试将“Main”类导入外部代码文档时失败,因此无法用于“Main.Raydel”的继承。非常感谢您的回复,这意味着很多。我们已经应用了代码。运行main.py会给出“未定义main”。将“from main import main(或import*)”添加到action_class.py仍然会出现错误。两个文件位于同一目录中。我们已经使用单独/非Qt文件测试了这种双重导入,当每个文件导入另一个文件时,都会出现相同的错误,就像导入整个文档一样,但在认为其他内容不存在时会陷入困境。即使每个文档中的单个变量也同样失败。有什么想法吗?考虑到你在
main.py
中导入了
QMainWindow
,对吗?这一切都是罕见的。您说错误是
无法导入name Main
,但我看不出您正在导入示例中名为
Main
的任何内容。除此之外,您还遇到了一个众所周知的问题,您的导入在您导入的
classImports
模块中是递归的,而在
classImports
模块中您导入的
classes
在StackOverflow中有很多问题。同意,导入位置错误。放"进口歌曲",;标签更改后的songs.songs(self)现在加载外部类。即使运行外部init,将代码从init添加到外部类或其他方法也不起作用,例如单击按钮。这是因为并没有外部类的实例,只有它触发的init吗?无论如何,问题是当您将代码放入
\uuuu init\uuuu
方法时,执行该代码的正确方法是创建thr类的实例。有关更多说明,请参见答案编辑。
 if i == self.u.tabs.indexOf(self.u.tabFirst): ActionClass.do_action()