按下按钮时执行功能,而不是脚本运行时执行

时间:2015-09-05 11:11:07

标签: python function tkinter command

我已经提出了这个代码:

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()函数。

2 个答案:

答案 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左右的默认值,然后如果infileNone,则使用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)

documentation -

的相关部分
  

执行函数定义时会计算默认参数值。这意味着在定义函数时,表达式将被计算一次,并且相同的“预先计算”值将用于每次通话。

答案 1 :(得分:0)

我遇到了同样的问题,这是我的解决方案:

self.button = Button(self, text="Preview", command=lambda: runFunction(arg0,arg1,arg2))