从按钮单击返回值

Posted

技术标签:

【中文标题】从按钮单击返回值【英文标题】:Return value from button click 【发布时间】:2016-01-11 17:03:08 【问题描述】:

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

任何想法如何使它工作?

【问题讨论】:

【参考方案1】:

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

self.file_path = None
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)
    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

【讨论】:

我一直在想,如果你的按钮点击动作的功能在另一个模块中,你会怎么做?【参考方案2】:

您获取文件路径的代码不起作用。 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 在调用连接方法时具有所需值时才有效。我们无法判断这在您的代码中是否属实,但在字里行间阅读,可能不是。因此,接受的答案可能更适合您的情况。

【讨论】:

以上是关于从按钮单击返回值的主要内容,如果未能解决你的问题,请参考以下文章

C# & ASP.NET MVC 5 - 从按钮单击执行存储过程,没有返回值

单击单选按钮或更改 PyQt 中的旋转框时,组合框索引值返回默认值 0

如何从 C# 中的表单返回值?

单击返回按钮而不是 $_POST 值时读取会话

js三大弹出消息框

如何从 Java Rest Web 服务返回 ajax 值?