PyQt:如何更新QLabel文本(从另一个python文件/函数访问QT小部件)? [重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

Problem:

我正在尝试使用Python在GUI中编写我的第一个应用程序。我将程序拆分为两个文件:一个用GUI(GUI.py),另一个用程序逻辑(Test.py)。

我希望在程序执行期间在我的GUI中更改一些内容(例如,带有状态的QLabel文本)来自Test.py级别。

我不知道如何访问任何控件。

Code:

GUI.朋友

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import QLabel, QPushButton, QGridLayout


class Ui_Widget(object):
    def setupUi(self):

        # controls
        statusLbl = QLabel("Status", 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(statusLbl, 0, 0)
        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()

test.朋友

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import QApplication, QWidget
from GUI import Ui_Widget

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):
    statusLbl.setText("working") # <- change of statusLbl.setText is not working

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

    statusLbl.setText("not " + statusLbl.text() )

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    WND = TestApp()
    sys.exit(app.exec_())
python python-3.x pyqt pyqt5
2个回答
0
投票

试试吧:

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
投票

你应该指出你想要访问ui。代替:

statusLbl.setText("working")

你应该使用:

obj.statusLbl.setText("working")

在启动时你应该通过self

self.statusLbl = QLabel("Status", self)
© www.soinside.com 2019 - 2024. All rights reserved.