关于python:从按钮单击返回值

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时完成连接,而file_path变量应在稍后调用open方法时分配。您没有提供涵盖从open方法到close方法的范围的代码,但是一种可能的解决方案是使用Muhammad Tahir Butt建议的类级别变量。

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

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

这里的问题是您不是将按钮单击连接到函数,而是连接到调用函数的结果。 Python在调用connect之前先评估参数。那肯定不是您想要的:您的函数返回None从而导致错误。

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

1
2
3
4
5
6
import functools

...

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

这可以解决您的调用问题,而无需更改相关变量。

但是,请注意,这仅在调用connect方法时file_path具有所需的值时才有效。我们无法确定代码中是否正确,但是在两行之间读取可能不会。因此,接受的答案可能更适合您的情况。