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