在嵌套实例内访问方法



我试图在常规时间更新PYQT标签,但是由于该标签是在另一个类实例__init__中创建的,所以我不知道该如何做。

这是代码的简化版本:

from PyQt5.QtCore import QTimer,QSize
from PyQt5.QtWidgets import (QApplication, QMainWindow, QLabel, QTabWidget, QVBoxLayout, QWidget)
import sys

class Main(QMainWindow): #01 THIS IS THE MAIN WINDOW
    def __init__(self):
        super().__init__()
        self.setMinimumSize(QSize(640,480))
        self.tabs_widget = Tabs(self)
        self.setCentralWidget(self.tabs_widget)

class Tabs(QWidget): #02 SPLIT MAIN WINDOW TO TABS
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        self.tabWidget = QTabWidget()
        self.tabWidget.addTab(TabOne(), "TabOne")
        self.textOne = QLabel("Text One - to be changed")
        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.textOne)
        mainLayout.addWidget(self.tabWidget)
        self.setLayout(mainLayout)
    def updateTextOne(self):
        self.textOne.setText("Text One - already changed")

class TabOne(QWidget): #03 TAB ONE
    def __init__(self):
        super().__init__()
        mainLayout = QVBoxLayout()
        self.textTwo = QLabel("Text Two to be changed")
        mainLayout.addWidget(self.textTwo)
        self.setLayout(mainLayout)
    #THIS IS THE METHOD I WOULD LIKE TO ACCESS!!!
    def updateTextTwo(self):
        self.textTwo.setText("Text Two - already changed")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = Main()
    main.show()
    timer = QTimer()
    timer.timeout.connect(main.tabs_widget.updateTextOne)
    timer.start(2000)
    #CAN'T FIGURE OUT HOW TO ACCESS CLASS TabOne > UpdateTextTwo()
    # timer = QTimer()
    # timer.timeout.connect(main.tabs_widget.tabWidget.)
    # timer.start(2000)

    sys.exit(app.exec_())

有两个Qlabels," TextOne"放置在Tabs类中,我可以通过从if __name__ == "__main__":

运行updateTextOne()来更新它

我无法弄清楚如何访问updateTextTwo()方法,但是它位于另一个类Tabone中,该类别是在上一个类Tabs __init__中创建的实例。

另一个问题:是否有更好的方法来达到这些方法。这只是项目的开始

只需将其存储在Tabs()实例中:

self.tabWidget = QTabWidget()
self.tab_one = TabOne()
self.tabWidget.addTab(self.tab_one, "TabOne")

并致电:

main.tabs_widget.tab_one.updateTextTwo()

请参阅widget()函数:

timer2 = QTimer()
timer2.timeout.connect(main.tabs_widget.tabWidget.widget(0).updateTextTwo)
timer2.start(2000)

(这仅是因为小部件已经存储在QTabWidget中,并且您可以使用widget函数访问它。Sanyas解决方案是更通用的解决方案。)

最新更新