PyQt5报错‘bool对象无filename属性’的原因排查
解决PyQt5中'bool' object has no attribute 'filename'报错
问题原因
你把getFile函数直接连接到按钮的clicked信号上,但PyQt的clicked信号默认会传递一个布尔值参数(表示按钮是否处于按下状态)。而你的getFile函数第一个参数定义为self,当信号触发时,这个布尔值被当作self传入,导致self变成了bool类型,自然没有filename属性,触发报错。
解决方法
方法一:将getFile改为类成员方法(推荐)
把getFile整合到ApplicationWindow类内部,作为成员方法,这样连接信号时self会正确指向窗口实例,不会被信号参数干扰。
修改后的ttool.py代码:
from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * import sys class ApplicationWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.main_widget = QWidget(self) l = QGridLayout(self.main_widget) open_button = QPushButton('Open') open_button.clicked.connect(self.getFile) l.addWidget(open_button, 0, 0) self.setCentralWidget(self.main_widget) # 设置中央部件,确保布局生效 def getFile(self): """获取CSV文件路径并打印文件名""" self.filename = QFileDialog.getOpenFileName(filter="csv (*.csv)")[0] print("File:", self.filename) if __name__ == '__main__': app = QApplication(sys.argv) aw = ApplicationWindow() aw.setWindowTitle("PyQt5 Matplot Example") aw.show() app.exec_()
此时可以删除独立的ttreadfile.py,或者将类方法逻辑拆分到模块中(需调整导入方式)。
方法二:保留独立函数,处理信号参数
如果一定要保留外部模块的getFile函数,可以用lambda或functools.partial忽略信号传递的布尔参数,手动传入窗口实例:
修改ttool.py中的信号连接部分:
from Module.ttreadfile import getFile from functools import partial # ... # 方式1:用lambda open_button.clicked.connect(lambda: getFile(self)) # 方式2:用functools.partial open_button.clicked.connect(partial(getFile, self))
这种方式下,ttreadfile.py的代码可以保持不变,但建议把函数参数名从self改为window,避免命名混淆。
内容的提问来源于stack exchange,提问作者HoneyWeGOTissues
相关产品推荐
相关产品推荐

