PyQt: Как обновить текст QLabel (доступ к виджетам QT из другого файла / функции python)? [Дубликат]

Если вы похожи на меня, когда я впервые начал использовать Java, я хотел использовать оператор «==» для проверки того, были ли два экземпляра String одинаковыми, но к лучшему или худшему это не правильный способ сделать это в Java.

В этом уроке я продемонстрирую несколько разных способов правильно сравнить строки Java, начиная с подхода, который я использую большую часть времени. В конце этого руководства по сопоставлению Java String я также обсужу, почему оператор «==» не работает при сравнении строк Java.

Вариант 1: Сравнение строк Java с методом equals Большая часть (возможно, в 95% случаев). Я сравниваю строки с методом equals класса Java String следующим образом:

if (string1.equals(string2))

Этот метод String равен методу для двух строк Java, и если они содержат точно такую ​​же строку символов, они считаются равными.

Взглянув на быстрый пример сравнения строк с методом equals, если был выполнен следующий тест, две строки не будут считаться равными, поскольку символы не являются точно такими же (случай символов различен):

String string1 = "foo";
String string2 = "FOO";

if (string1.equals(string2))
{
    // this line will not print because the
    // java string equals method returns false:
    System.out.println("The two strings are the same.")
}

Но, когда две строки содержат одну и ту же строку символов, метод equals вернет true, как в этот пример:

String string1 = "foo";
String string2 = "foo";

// test for equality with the java string equals method
if (string1.equals(string2))
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Вариант 2: Сравнение строк с методом equalsIgnoreCase

В некоторых строковых сравнительных тестах вы захотите игнорируйте, являются ли строки строчными или строчными. Если вы хотите проверить свои строки на равенство в этом случае нечувствительным образом, используйте метод equalsIgnoreCase класса String, например:

String string1 = "foo";
String string2 = "FOO";

 // java string compare while ignoring case
 if (string1.equalsIgnoreCase(string2))
 {
     // this line WILL print
     System.out.println("Ignoring case, the two strings are the same.")
 }

Вариант 3: сравнение строк Java с методом compareTo

Существует также третий, менее распространенный способ сравнения строк Java, и это с методом сравнения String класса. Если две строки точно совпадают, метод compareTo вернет значение 0 (ноль). Ниже приведен краткий пример того, как выглядит этот метод сравнения строк:

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Пока я пишу об этой концепции равенства в Java, важно отметить, что язык Java включает в себя метод equals в базовый класс Java Object. Всякий раз, когда вы создаете свои собственные объекты, и вы хотите предоставить средства для проверки того, являются ли два экземпляра вашего объекта «равными», вы должны переопределить (и реализовать) этот метод equals в своем классе (точно так же, как язык Java предоставляет это равенство / сравнение в методе String равно).

Вы можете посмотреть на это ==, .equals (), compareTo () и compare ()

0
задан eyllanesc 10 March 2019 в 19:44
поделиться

2 ответа

Попробуйте:

from PyQt5.QtWidgets import QLabel, QPushButton, QGridLayout
from PyQt5.QtWidgets import QApplication, QWidget
#from GUI import Ui_Widget


class Ui_Widget(object):
    def setupUi(self):
        # controls
        self.statusLbl = QLabel("Status", self)                    # + self.
        changeBtn = QPushButton("&Change text", self)
        closeBtn  = QPushButton("&Close", self)
        #statusLbl.setText("working") # <- here it works, but not in Test.py

        # GridLayout
        CtrLayout = QGridLayout()
        CtrLayout.addWidget(self.statusLbl, 0, 0)    # self.
        CtrLayout.addWidget(changeBtn, 0, 1)
        CtrLayout.addWidget(closeBtn, 0, 2)       
        self.setLayout(CtrLayout)

        # onClick events
        changeBtn.clicked.connect(self.changeText)
        closeBtn.clicked.connect(self.closeApp)

        #self.setGeometry(20, 20, 300, 100)
        #self.setWindowTitle("TEST APP")
        self.show()


class TestApp(QWidget, Ui_Widget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setupUi()   

    def changeText(self):
        generateReport(self)  # code moved to separate function for better clarity

    def closeApp(self):
        self.close()

def generateReport(obj):

    if obj.statusLbl.text() != "working":
        obj.statusLbl.setText("working")                      # <- + obj.

    # ...
    # 200 lines of code here
    #...

    else:
        obj.statusLbl.setText("not " + obj.statusLbl.text())  # <- + obj.


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    WND = TestApp()
    WND.show()                   
    sys.exit(app.exec_())

enter image description here

0
ответ дан S. Nick 10 March 2019 в 19:44
поделиться

Вы должны указать, что вы хотите получить доступ к пользовательскому интерфейсу. Вместо:

statusLbl.setText("working")

Вы должны использовать:

obj.statusLbl.setText("working")

Во время инициации вы должны пройти self:

self.statusLbl = QLabel("Status", self)
0
ответ дан Karls 10 March 2019 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: