python - 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_())
解决方案
试试看:
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_())
推荐阅读
- python - 通过函数运行文件的内容
- three.js - 单页网站的 WebGL 优化
- swift - 如何使用 Alamofire 请求在我的 tableView 中显示我的数据
- java - 在 Java 中将 UUID 编码为 Base62(不是 Base64)
- ruby-on-rails - 验证不能防止破坏 - Rails 5
- java - 通过污点分析和自定义注释检测 Find Sec Bugs 中的信息泄漏
- python - Python 将 *unknown 格式字符串解析为 json 或 dict
- elasticsearch - 无法在 Ubuntu 上的 kubernetes 集群中访问 Kibana 仪表板服务
- docker - 为 Swarm 安装 Redis docker 镜像集群?
- ggplot2 - 结合 sf 的 poligons 在 ggplot 中绘图时,栅格的 NA 值具有填充