我已经提出了这个代码:
import tkinter
from tkinter.filedialog import askopenfilename
def browse():
inputfilename=askopenfilename()
return inputfilename
def fileManipulator(infile=browse(),outfile="C:\\out\\File.kml"):
#code that manipulates the file here
file.save(outfile)
root=tkinter.Tk()
browseButton=tkinter.Button(root,text="Browse",command=browse)
browseButton.pack()
fileButton=tkinter.Button(root,text="Manipulate file",command=fileManipulator)
fileButton.pack()
root.mainloop()
代码为我提供了一个带有两个按钮的GUI。 浏览按钮应该让用户浏览输入文件。 Manipulate File 按钮应该处理该文件并将文件输出保存在某处。
我面临的问题是浏览askopenfilename
函数在我运行脚本时就会执行。这是因为我在fileManipulator函数的定义中调用了函数。我在fileManipulator中调用函数的原因显然是因为我想使用askopenfilename返回的路径作为输入文件。
是否有一种解决方法可以立即执行askopenfilename
,但是当按下浏览按钮时?
编辑:当我按下文件操作器按钮时,我也不希望再次执行browse()函数。
答案 0 :(得分:3)
编辑:有关更新的要求 -
抱歉,我应该补充一些细节。您的解决方案运行良好,因为现在没有立即执行browse()函数。但是,除此之外,我还希望GUI只使用“浏览”对话框提示用户一次。在您的解决方案中,当用户按下“浏览”时会提示用户一次,而当按下“文件管理器”时则会再次提示用户。我还编辑了我的问题,以反映我在寻找的东西。
如果是这样,我猜你可以定义某种global
变量,在调用browse()
时更新,并使用它。如果全局变量为None
或默认值,则表示您是第一次调用file Manipulate
,然后使函数调用browse()
方法。示例 -
import tkinter
from tkinter.filedialog import askopenfilename
inputfile = None
def browse():
global inputfile
inputfile=askopenfilename()
def fileManipulator(outfile="C:\\out\\File.kml"):
global inputfile
if inputfile is None:
browse()
#code that manipulates the file here
file.save(outfile)
root=tkinter.Tk()
browseButton=tkinter.Button(root,text="Browse",command=browse)
browseButton.pack()
fileButton=tkinter.Button(root,text="Manipulate file",command=fileManipulator)
fileButton.pack()
root.mainloop()
FOR ORIGINAL ISSUE:
问题是函数的默认参数是在定义函数时执行的(而不是在调用它时),这是GOTCHAs的主要原因,如 Mutable Default Arguments ,以及你的问题
如果您希望能够将infile
作为参数发送,并且能够使用browse()
功能,则不提供。我建议你使用**kwargs
。示例 -
def fileManipulator(outfile="C:\\out\\File.kml",**kwargs):
if 'infile' in kwargs:
infile = kwargs['infile']
else:
infile = browse()
#code that manipulates the file here
file.save(outfile)
另一种更简单的方法是使用类似None
左右的默认值,然后如果infile
为None
,则使用browse()
方法 -
def fileManipulator(infile=None,outfile="C:\\out\\File.kml"):
if infile is None:
infile=browse()
#code that manipulates the file here
file.save(outfile)
但这与您最初尝试的不同,例如,如果您将函数调用为 - fileManipulator(infile=None)
,则会导致browse()
函数被调用。
最后,如果您不需要infile
/ outfile
作为参数,请不要将它们定义为默认参数,而是在函数体中定义它们 -
def fileManipulator():
infile=browse()
outfile="C:\\out\\File.kml"
#code that manipulates the file here
file.save(outfile)
的相关部分
执行函数定义时会计算默认参数值。这意味着在定义函数时,表达式将被计算一次,并且相同的“预先计算”值将用于每次通话。
答案 1 :(得分:0)
我遇到了同样的问题,这是我的解决方案:
self.button = Button(self, text="Preview", command=lambda: runFunction(arg0,arg1,arg2))