我有一个getFile函数,它将获取csv文件的地址并在命令控制台中打印文件名。当我在主窗口中运行该函数时,我不断得到"'bool'对象没有属性'文件名'"。为什么会这样?
ttreadfile.py
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
def getFile(self):
"""this function will get the address of the sdv file location"""
self.filename = QFileDialog.getOpenFileName(filter = "csv (*.csv)")[0]
print("File:",self.filename)
ttool.py
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from Module.ttreadfile import *
class ApplicationWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
"""set layout of window"""
self.main_widget = QWidget(self)
l = QGridLayout(self.main_widget)
open_button =QPushButton('Open')
open_button.clicked.connect(getFile)
l.addWidget(open_button, 0,0)
if __name__ == '__main__':
app = QApplication(sys.argv)
aw = ApplicationWindow()
aw.setWindowTitle("PyQt5 Matplot Example")
aw.show()
#sys.exit(qApp.exec_())
app.exec_()
QPushButton
小部件继承了QAbstractButton
的clicked
信号,也是QCheckBox
的父类。 因此,当发出clicked
信号时,将使用默认的checked
布尔参数发送,该参数指示按钮的检查状态。对于QPushButton
,此参数始终为 False,并且在连接到信号的插槽中经常被忽略或省略。
在您的情况下发生的情况是,getFile
函数的self
参数正在填充checked
参数的值,该参数是一个布尔值,因此没有filename
属性。
此外,由于getFile
不是ApplicationWindow
类的方法,因此它不会收到self
,因为它是默认的第一个参数,就像您调用self.getFile
一样。
解决方法是简单地将单击的信号分配给可以使用适当参数触发getFile
函数的中间方法。
例如
class ApplicationWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
...
open_button.clicked.connect(self.get_file)
def get_file(self):
getFile(self)
或者按照注释中的建议,您可以简单地使用 lambda 来触发函数:
open_button.clicked.connect(lambda : getFile(self))
我还建议更改 getFile 函数的签名,以便清晰和可读。
例如:
def getFile(instance):
"""this function will get the address of the sdv file location"""
instance.filename = QFileDialog.getOpenFileName(filter = "csv (*.csv)")[0]
print("File:",instance.filename)