点击按钮返回值

时间:2015-10-13 19:41:42

标签: python function pyqt

我努力从函数返回一个值,当我点击PyQt中的按钮时调用该函数。这就是我想给变量赋值的方法:

file_path = self.Button_open.clicked.connect(self.OpenTextFile)

整个功能看起来像这样:

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参数应该是可调用的或信号,而不是'NoneType'

有什么想法让它发挥作用?

2 个答案:

答案 0 :(得分:2)

将file_path存储在类级别变量中,并在按钮单击方法中更新该值。

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])

然后,

self.Button_save.clicked.connect(self.SaveTextFile(file_path))

也是你的

self.Button_save.clicked.connect(self.SaveTextFile)

应该是

def SaveTextFile(self):
    save(self.file_path)     # Your code to save file

并在您的保存点击方法中

/sitecore/system/Modules/Redirect Module

答案 1 :(得分:1)

获取文件路径的代码无效。 connect方法不会调用连接函数,也不会分配其返回值。通常,我们可能希望在创建GUI时完成连接,而稍后在调用open方法时应分配file_path变量。您没有提供跨越范围的代码,从open方法到close方法,但可能的解决方案是使用Muhammad Tahir Butt建议的类级变量。

但是,您引用的错误来自以下代码行:

self.Button_save.clicked.connect(self.SaveTextFile(file_path))

这里的问题是你连接的按钮不是点击功能,而是点击调用功能的结果。 Python在调用connect之前评估参数。这肯定不是你想要的:你的函数返回None导致错误。

还有其他方法可以做你想要的,但最直接的解决方法是创建一个部分评估的函数或一个lambda表达式,它捕获file_path的值但尚未执行该函数。例如:

import functools

...

self.Button_save.clicked.connect(
        functools.partial(self.SaveTextFile,file_path))

这可以在不更改相关变量的情况下修复您的调用问题。

但请注意,仅当file_path在调用connect方法时具有所需的值时,此方法才有效。我们无法判断你的代码中是否存在这种情况,但是在行之间进行读取可能并非如此。因此,在您的情况下,接受的答案可能更合适。