Return 来自按钮点击的价值
Return value from button click
我在 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 argument should be a callable or a signal, not 'NoneType'
有什么想法让它发挥作用吗?
将 file_path 存储在 class 级别变量中,并在您的按钮点击方法中更新该值。
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
您获取文件路径的代码将不起作用。 connect 方法不会调用连接函数,也不会为其分配 return 值。通常我们可能希望在创建 GUI 时完成连接,而 file_path
变量应该稍后在调用 open 方法时分配。您没有提供跨越从打开方法到关闭方法的范围的代码,但一个可能的解决方案是使用 Muhammad Tahir Butt 建议的 class 级别变量。
但是,您引用的错误来自这行代码:
self.Button_save.clicked.connect(self.SaveTextFile(file_path))
这里的问题是您不是将按钮点击连接到函数,而是连接到调用函数的结果。 Python 在调用 connect
之前评估参数。那肯定不是你想要的:你的函数 returns None
导致了错误。
还有其他方法可以执行您想要的操作,但最直接的解决方法是创建一个部分计算的函数或一个捕获 file_path
值但尚未执行该函数的 lambda 表达式。例如:
import functools
...
self.Button_save.clicked.connect(
functools.partial(self.SaveTextFile,file_path))
这可以在不更改相关变量的情况下解决您的调用问题。
但是,请注意,这仅在 file_path
在调用连接方法 时具有所需的值时有效 。我们无法判断您的代码是否属实,但从字里行间看,可能不是。因此,接受的答案可能更适合您的情况。
我在 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 argument should be a callable or a signal, not 'NoneType'
有什么想法让它发挥作用吗?
将 file_path 存储在 class 级别变量中,并在您的按钮点击方法中更新该值。
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
您获取文件路径的代码将不起作用。 connect 方法不会调用连接函数,也不会为其分配 return 值。通常我们可能希望在创建 GUI 时完成连接,而 file_path
变量应该稍后在调用 open 方法时分配。您没有提供跨越从打开方法到关闭方法的范围的代码,但一个可能的解决方案是使用 Muhammad Tahir Butt 建议的 class 级别变量。
但是,您引用的错误来自这行代码:
self.Button_save.clicked.connect(self.SaveTextFile(file_path))
这里的问题是您不是将按钮点击连接到函数,而是连接到调用函数的结果。 Python 在调用 connect
之前评估参数。那肯定不是你想要的:你的函数 returns None
导致了错误。
还有其他方法可以执行您想要的操作,但最直接的解决方法是创建一个部分计算的函数或一个捕获 file_path
值但尚未执行该函数的 lambda 表达式。例如:
import functools
...
self.Button_save.clicked.connect(
functools.partial(self.SaveTextFile,file_path))
这可以在不更改相关变量的情况下解决您的调用问题。
但是,请注意,这仅在 file_path
在调用连接方法 时具有所需的值时有效 。我们无法判断您的代码是否属实,但从字里行间看,可能不是。因此,接受的答案可能更适合您的情况。