首页 > 解决方案 > PyQt:如何更新 QLabel 文本(从另一个 python 文件/函数访问 QT 小部件)?

问题描述

问题:

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

我想在程序执行期间从Test.py级别更改我的 GUI 中的某些内容(例如带有状态的 QLabel 文本)。

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

代码:

图形用户界面.py

#!/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()

测试.py

#!/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_())

标签: pythonpython-3.xpyqtpyqt5

解决方案


试试看:

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_())

在此处输入图像描述


推荐阅读