Доступ к методу внутри вложенных экземпляров - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь регулярно обновлять метку 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, я могу обновить его, запустив updateTextOne() из if __name__ == "__main__":

Я могуНе могу понять, как получить доступ к методу updateTextTwo(), однако, он находится в другом классе TabOne, экземпляр которого создан в предыдущем классе. Tabs __init__.

Другие вопросы: есть ли лучший способ для достижения этихметоды.Это только начало проекта, но эти вложенные экземпляры уже делают проект слишком сложным для моих навыков программирования?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

см. widget () функция:

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

(Это работает только потому, что виджет уже хранится в QTabWidget, и вы можете получить к нему доступ с помощью функции widgetРешение Sanyas является более общим решением.)

0 голосов
/ 04 марта 2019

Просто сохраните его в Tabs() экземпляре здесь:

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

И позвоните:

main.tabs_widget.tab_one.updateTextTwo()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...