Найдите QLabel по его имени и используйте функцию setText()

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

Что я пытаюсь сделать, так это найти QLabel в QGridLayout, импортировав файл .txt и прочитав имена и значения. Например: power 5

Теперь мне нужно найти QLabel с именем "power_fw", чтобы установить текст этой метки на "5".

set_value("power 5")

def set_value(talent):
     list_value = talent.split(" ")       # Now i have a list with talent[0] = "power" and its value at talent[1] = "5"
     talent_now = talent[0] + "_fw"       # I already have the exact name of the QLabel i am trying to find, which would be "power_fw" at this moment
     ui.talent_now.setText(talent[1])     # So the idea is that "talent_now" is a string whichs value is the name of the QLabel i am trying to set a new text. Obviously it does not work, because talent_now is not a QLabel but just its name. 

Я надеюсь, что кто-то может помочь мне с этой конкретной проблемой, и еще раз, извините, если эта тема уже каким-то образом существует. Я не мог найти ничего, что сработало еще.

темы, которые я нашел интересными в контексте этой проблемы:

получить виджеты по имени из макета

findChild для объекта, созданного в конструкторе pyqt

Ни одно из решений, представленных в этих темах, не помогло мне сделать это правильно.


person Pedro    schedule 21.03.2019    source источник
comment
Вы имеете в виду, что self.ui.findChild(QLabel, talent_now).setText(talent[1]) не работает?   -  person p-a-o-l-o    schedule 21.03.2019
comment
Дайте нам немного больше информации. Это обычный метод внутри класса? В этом случае вам не хватает self в качестве параметра (def set_value(self, talent):) и экземпляра пользовательского интерфейса (self.ui.talent_now...). Как вы это написали, ваша функция set_value находится в глобальной области (таким образом, ожидая, что ui будет эквивалентно App.ui или всему, что вы решите назвать своим экземпляром пользовательского интерфейса), и вы вызываете ее перед ее определением. Это то, как вы пытаетесь запустить свой код?   -  person jfaccioni    schedule 21.03.2019


Ответы (2)


Вы всегда можете просмотреть элементы макета и проверить имя объекта каждого виджета.

Является ли это допустимым решением для ваших требований?

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QLabel, QPushButton
from PyQt5.QtCore import pyqtSlot

if __name__ == '__main__':
    app = QApplication(sys.argv)

    label1 = QLabel()
    label1.setText('label1')
    label1.setObjectName('label1')

    label2 = QLabel()
    label2.setText('label2')
    label2.setObjectName('label2')

    btn = QPushButton("find label")

    layout = QGridLayout()
    layout.addWidget(label1, 0, 0)
    layout.addWidget(label2, 0, 1)
    layout.addWidget(btn, 1, 0, 1, 2)

    w = QWidget()
    w.setLayout(layout)
    w.resize(500, 400)
    w.show()

    def find_label(event):
        print('click')
        childs_count = layout.count()
        for c in range(childs_count):
            w = layout.itemAt(c)
            if w.widget().objectName() == 'label2':
                print('FOUND widget: {}'.format(w.widget().objectName()))

    btn.clicked.connect(find_label)

    sys.exit(app.exec())
person jgoday    schedule 21.03.2019

Вы можете использовать метод QWidget::findChild для поиска определенного объекта. Это полезно, когда вам нужно искать его рекурсивно:

    label1 = QLabel()
    label1.setObjectName("power")
    label2 = QLabel()
    label2.setObjectName("status")
    label3 = QLabel()
    label3.setObjectName("info")

    w = QWidget()
    layout = QVBoxLayout(w)
    layout.addWidget(label1)
    layout.addWidget(label2)
    layout.addWidget(label3)

    label = w.findChild(QLabel, "power")
    label.setText("12")
    w.show()

person Dimitry Ernot    schedule 21.03.2019