2015-09-05 66 views
1

我想出了這個代碼時:執行函數,而不是腳本運行

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。 瀏覽按鈕應該讓用戶瀏覽輸入文件。 操縱文件按鈕應該處理該文件並將文件輸出保存在某處。

我面臨的問題是,只要我運行腳本,瀏覽askopenfilename函數就會執行。發生這種情況是因爲我正在調用fileManipulator函數定義內的函數。我在調用fileManipulator函數的原因顯然是因爲我想使用askopenfilename返回的路徑作爲輸入文件。

是否有解決方法立即不執行askopenfilename,但是當按下按鈕時?

EDITS:我也不想瀏覽()函數,當我按下文件機械臂按鈕被再次執行。

回答

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() 

原創ISSUE:

是,當函數被定義(沒有被調用時)爲函數的默認參數是執行的問題,這是GOTCHA的主要原因是可變默認參數和您的問題。

如果您希望能夠以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 -的相關部分

默認參數值在執行函數定義時進行評估。這意味着該表達式在函數被定義時被評估一次,並且每次調用都使用相同的「預先計算」值。

+0

對不起,我應該補充一些更多的細節。您的解決方案很好,因爲browse()函數現在不會立即執行。但是,除此之外,我還希望GUI在「瀏覽」對話框中僅提示用戶一次。在您的解決方案中,當用戶按下瀏覽按鈕時會提示用戶,而另一次按下文件控制器時會提示用戶。我還編輯了我的問題,以反映我正在尋找的內容。 – multigoodverse

+0

好吧,讓我直接得到它,你想瀏覽()按鈕顯示當你第一次點擊文件操作,但如果它第二次點擊,你不想再次瀏覽瀏覽? –

+0

我想要三件事情: 1.執行腳本時,會顯示一個帶有兩個按鈕的GUI,但不會發生任何其他事情 2.當按下瀏覽按鈕時,系統會提示用戶瀏覽對話框,然後選擇文件中的文件系統。 3.當按下文件操縱器按鈕時,腳本將處理用戶在步驟2中選擇的文件,並且不會再次使用瀏覽對話框詢問提示。 目前,瀏覽對話框仍然出現時,文件Manipuator是prssed。 – multigoodverse

0

我有同樣的問題,這是我的解決辦法:

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