【问题标题】:PyQt: How to update QLabel text (access to QT widgets from another python file/function)? [duplicate]PyQt:如何更新 QLabel 文本(从另一个 python 文件/函数访问 QT 小部件)? [复制]
【发布时间】:2019-03-10 17:51:52
【问题描述】:

问题:

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

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

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

代码:

GUI.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()

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

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案1】:

    试试看:

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

    【讨论】:

    • 非常感谢,这很好用!现在我将所有代码都放在一个文件中。老实说这不是什么大问题,这应该是一个 GUI 非常简单的小应用程序。顺便说一句,我很好奇是否有可能将 GUI 与程序逻辑分开。
    【解决方案2】:

    您应该指出您要访问 ui。而不是:

    statusLbl.setText("working")
    

    你应该使用:

    obj.statusLbl.setText("working")
    

    在启动时你应该通过self:

    self.statusLbl = QLabel("Status", self)
    

    【讨论】:

    • statusLbl 是一个 QLabel 对象。在def generateReport(obj) 函数中使用您的代码后,我收到此错误:NameError: name 'self' is not defined
    • 啊,好吧,您将self 传递为obj,就像上面提到的@S.Nick。所以它将是obj.statusLbl.setText("working")obj.ui.statusLbl.setText("working")
    • 还是有问题。对于obj.statusLbl.setText("working"),我收到AttributeError: 'TestApp' object has no attribute 'statusLbl' 错误。对于obj.ui.statusLbl.setText("working")AttributeError: 'TestApp' object has no attribute 'ui' 错误。
    • 我敢打赌第一种语法(没有ui 是正确的),但是您还需要在启动对象时添加self。我的意思是:self.statusLbl = QLabel("Status", self)。让我们知道它现在是否有效。
    • 完美运行!还有一个问题:我应该用谷歌搜索哪些术语来了解它是如何工作的?有没有相关说明的教程?
    猜你喜欢
    • 1970-01-01
    • 2012-06-10
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2016-10-12
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多