在 PyQt5 中拆分 Python 类

Splitting Python classes in PyQt5

我想将一个大的 class (UI) 分成几个较小的,但我在访问 GUI 其余部分的其他字段时遇到问题。 我使用 QT Creator 创建了一个简单的 GUI,现在我想使用 PyQt5 对其进行编程。 当我将函数拆分为单独的 classes 并使用 verifyBtn 按钮时,出现错误:

self.hostname = self.IPInp.text()
AttributeError: 'bool' object has no attribute 'IPInp'

如果 verify_button 函数在 main UI class 中,那么程序运行正常。您是否知道代码应该是什么样子,以便我可以将函数拆分为另一个 class?

from PyQt5.QtWidgets import *
from PyQt5 import uic
import os, sys

class ButtonHandler(QMainWindow):
    def __init__(self) -> None:
        super().__init__()

    def verify_button(self):
        self.hostname = self.IPInp.text()

        response = os.system("ping -n 1 " + self.hostname)
        if response == 0:
            self.verifyBtn.setStyleSheet('QPushButton { color: green;}')
            self.verifyBtn.setText("OK")
        else:
            self.verifyBtn.setStyleSheet('QPushButton { color: red;}')
            self.verifyBtn.setText("NO")

class UI(QMainWindow):
    def __init__(self):
        super().__init__()       

        uic.loadUi("Test_gui.ui", self)
        self.vBtn = ButtonHandler()
        self.verifyBtn.clicked.connect(self.vBtn.verify_button)
  
if __name__ == '__main__':
    app = QApplication([])
    win = UI()

    win.show()
    sys.exit(app.exec_())

ButtonHandler__init__-method 中,您可以通过以下方式传递对 UI 的引用(如果您使用 toplevel_ui 作为对 [=14= 的引用])

class ButtonHandler(QMainWindow):
    def __init__(self, toplevel) -> None:
        super().__init__()
        self.toplevel_ui = toplevel_ui

所以当您从 UI 创建 ButtonHandler 的实例时,您现在写

self.vBtn = ButtonHandler(self)

然后当你想从 class ButtonHandler 访问 class UI 的属性时,你写 self.toplevel_ui.<attribute_name> 替换 <attribute_name>随心所欲。例如 verifyBtnverify_button.