通过主窗口更改小部件中的标签文本
Change label text in widget via mainwindow
我对使用 Python 进行 GUI 编程还很陌生...任何有经验的程序员很快就会发现这一点。我正在处理的程序应该有一个带有嵌套 QTab 小部件的 MainWindow,它又包含几个单独的小部件。一段时间以来,我一直在尝试让下面的简化代码工作。不幸的是我得到了 AttributeError: 'bool' object has no attribute 'label_00'.
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QAction, QWidget, QVBoxLayout, QTabWidget, QToolBar
from PyQt5.QtCore import Qt, QSize, pyqtSignal, pyqtSlot
#from PyQt5 import QtGui
#from LftQAFs import *
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.initUI()
def initUI(self):
self.setWindowTitle("Light")
self.setGeometry(100,100,750,120)
toolbar = QToolBar("Tool Bar")
toolbar.setIconSize(QSize(24,24))
self.addToolBar(toolbar)
button_loadLftQAF = QAction("Load Data", self)
toolbar.addAction(button_loadLftQAF)
button_loadLftQAF.triggered.connect(SubWidget.funcTest)
self.setCentralWidget(SubWidget())
self.show()
class SubWidget(QWidget):
signalFuncTest = pyqtSignal()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.layout_main = QVBoxLayout(self)
self.label_00 = QLabel("Label")
self.layout_main.addWidget(self.label_00)
self.setLayout(self.layout_main)
@pyqtSlot()
def funcTest(self):
print("works")
self.label_00.setText('Changed Label')
app = QApplication([])
window = MainWindow()
window.show()
app.exec()
我会很高兴得到这个问题的解决方案,以及我应该阅读哪个主题以了解我做错了什么的提示。任何结构建议也非常感谢...:)
谢谢,马克斯
SubWidget.funcTest
是一个实例方法,这意味着你需要先创建一个SubWidget
的实例,例如sub_widget = SubWidget()
,并将 sub_widget.funcTest
连接到 button_loadLftQAF.triggered
而不是 SubWidget.funcTest
,例如
class MainWindow(QMainWindow):
...
def initUI(self):
...
sub_widget = SubWidget(self)
button_loadLftQAF.triggered.connect(sub_widget.funcTest)
self.setCentralWidget(sub_widget)
...
我对使用 Python 进行 GUI 编程还很陌生...任何有经验的程序员很快就会发现这一点。我正在处理的程序应该有一个带有嵌套 QTab 小部件的 MainWindow,它又包含几个单独的小部件。一段时间以来,我一直在尝试让下面的简化代码工作。不幸的是我得到了 AttributeError: 'bool' object has no attribute 'label_00'.
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QAction, QWidget, QVBoxLayout, QTabWidget, QToolBar
from PyQt5.QtCore import Qt, QSize, pyqtSignal, pyqtSlot
#from PyQt5 import QtGui
#from LftQAFs import *
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.initUI()
def initUI(self):
self.setWindowTitle("Light")
self.setGeometry(100,100,750,120)
toolbar = QToolBar("Tool Bar")
toolbar.setIconSize(QSize(24,24))
self.addToolBar(toolbar)
button_loadLftQAF = QAction("Load Data", self)
toolbar.addAction(button_loadLftQAF)
button_loadLftQAF.triggered.connect(SubWidget.funcTest)
self.setCentralWidget(SubWidget())
self.show()
class SubWidget(QWidget):
signalFuncTest = pyqtSignal()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.layout_main = QVBoxLayout(self)
self.label_00 = QLabel("Label")
self.layout_main.addWidget(self.label_00)
self.setLayout(self.layout_main)
@pyqtSlot()
def funcTest(self):
print("works")
self.label_00.setText('Changed Label')
app = QApplication([])
window = MainWindow()
window.show()
app.exec()
我会很高兴得到这个问题的解决方案,以及我应该阅读哪个主题以了解我做错了什么的提示。任何结构建议也非常感谢...:)
谢谢,马克斯
SubWidget.funcTest
是一个实例方法,这意味着你需要先创建一个SubWidget
的实例,例如sub_widget = SubWidget()
,并将 sub_widget.funcTest
连接到 button_loadLftQAF.triggered
而不是 SubWidget.funcTest
,例如
class MainWindow(QMainWindow):
...
def initUI(self):
...
sub_widget = SubWidget(self)
button_loadLftQAF.triggered.connect(sub_widget.funcTest)
self.setCentralWidget(sub_widget)
...