这个问题在这里已有答案:
我正在尝试使用Python在GUI中编写我的第一个应用程序。我将程序拆分为两个文件:一个用GUI(GUI.py),另一个用程序逻辑(Test.py)。
我希望在程序执行期间在我的GUI中更改一些内容(例如,带有状态的QLabel文本)来自Test.py级别。
我不知道如何访问任何控件。
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_())
试试吧:
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_())
你应该指出你想要访问ui。代替:
statusLbl.setText("working")
你应该使用:
obj.statusLbl.setText("working")
在启动时你应该通过self
:
self.statusLbl = QLabel("Status", self)