Return value from button click
我很想从单击PyQt中的按钮时调用的函数返回值。 这就是我想为变量添加值的方式:
1 | file_path = self.Button_open.clicked.connect(self.OpenTextFile) |
整个功能如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def OpenTextFile(self): dialog = QtGui.QFileDialog() dialog.setWindowTitle("Choose a file to open") dialog.setFileMode(QtGui.QFileDialog.ExistingFile) dialog.setNameFilter("Text (*.txt);; All files (*.*)") dialog.setViewMode(QtGui.QFileDialog.Detail) filename = QtCore.QStringList() if(dialog.exec_()): file_name = dialog.selectedFiles() plain_text = open(file_name[0]).read() self.Editor.setPlainText(plain_text) return str(file_name[0]) |
现在,当我想将file_path传递给另一个函数时,python解释器说
self.Button_save.clicked.connect(self.SaveTextFile(file_path))
TypeError: connect() slot argument should be a callable or a signal, not 'NoneType'
有什么想法使它起作用吗?
将file_path存储在类级别的变量中,然后在您的按钮click方法中更新该值。
1 2 | self.file_path = None self.Button_open.clicked.connect(self.OpenTextFile) |
然后,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def OpenTextFile(self): dialog = QtGui.QFileDialog() dialog.setWindowTitle("Choose a file to open") dialog.setFileMode(QtGui.QFileDialog.ExistingFile) dialog.setNameFilter("Text (*.txt);; All files (*.*)") dialog.setViewMode(QtGui.QFileDialog.Detail) filename = QtCore.QStringList() if(dialog.exec_()): file_name = dialog.selectedFiles() plain_text = open(file_name[0]).read() self.Editor.setPlainText(plain_text) self.file_path = str(file_name[0]) |
还有你的
1 | self.Button_save.clicked.connect(self.SaveTextFile(file_path)) |
应该
1 | self.Button_save.clicked.connect(self.SaveTextFile) |
然后在您的保存点击方法中
1 2 | def SaveTextFile(self): save(self.file_path) # Your code to save file |
您获取文件路径的代码无效。 connect方法不会调用连接的函数,并且不会分配其返回值。通常,我们可能期望在创建GUI时完成连接,而
但是,您引用的错误来自以下代码行:
1 | self.Button_save.clicked.connect(self.SaveTextFile(file_path)) |
这里的问题是您不是将按钮单击连接到函数,而是连接到调用函数的结果。 Python在调用
还有其他方法可以执行您想要的操作,但是最直接的解决方法是创建一个部分求值的函数或lambda表达式,该函数捕获
1 2 3 4 5 6 | import functools ... self.Button_save.clicked.connect( functools.partial(self.SaveTextFile,file_path)) |
这可以解决您的调用问题,而无需更改相关变量。
但是,请注意,这仅在调用connect方法时