gpt4 book ai didi

python - PyQt 代码拆分——设计与功能

转载 作者:太空宇宙 更新时间:2023-11-04 06:03:02 25 4
gpt4 key购买 nike

我正在努力理解如何在 (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 的建议,您可以将代码分成python modules。 .然后在您的主模块中导入它们(使用它们)。

例如,您发布的代码可以分成文件:

# actions_class.py

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

# main.py

from action_class import ActionClass # This line no need much explanation ;)

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__

app = Main()
app.show()
sys.exit(app.exec_())

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

更多解释

让我们看看:

__init__ 方法中执行代码的正确方法是创建一个实例。请参见下面的示例。

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()

另一方面,将不用于初始化实例的代码放在 __init__ 方法中是一种不好的做法。如果您不需要该实例,但又想将函数存储在您创建的类(类似于 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")

然后你可以像这样使用它:

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

关于python - PyQt 代码拆分——设计与功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23738003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com