2014-01-05 127 views
1

我有一個相當簡單的程序,到目前爲止,只有幾個按鈕與他們的事件。但是,當我運行程序時,按鈕事件觸發一旦啓動按鈕。Tkinter按鈕事件觸發負載

鬧事一塊我的代碼看起來是這樣的:

def initUI(self): 

    self.parent.title("Windows") 
    self.style = Style() 
    self.style.theme_use("default") 
    self.pack(fill=BOTH, expand=1) 

    abtn = Button(self, text="Open", command=load_file(area)) 
    abtn.grid(row=1, column=3) 

    cbtn = Button(self, text="Close", command=self.parent.destroy) 
    cbtn.grid(row=2, column=3, pady=4) 

我跑了線路和LOAD_FILE線(它是一個打開文件對話框和地區是一個帆布我前面初始化)事件之前就打開下一個按鈕被初始化或窗口可見。 儘可能具體:我不希望它沒有點擊按鈕就會觸發。那麼我在這裏做錯了什麼?

編輯:

這是LOAD_FILE事件:

def load_file(area): 
    fname = askopenfilename(filetypes=(("TIF", "*.tif;*.tiff"), 
             ("GIF", "*.gif"), 
             ("JPEG", "*.jpg"))) 
    if fname: 
     fname = fname.replace("/", "\\") 
     print(fname) 
     Images.path = fname 
     import_file(fname, area) 
    else: 
     print "Could not open file ", fname 

    return fname 

回答

3

在下面一行,代碼不load_file,但調用load_file並綁定函數調用的返回值。

abtn = Button(self, text="Open", command=load_file(area)) 

使用labmda函數對象進行更換:

abtn = Button(self, text="Open", command=lambda: load_file(area)) 
+0

它的工作,謝謝。我只是想知道爲什麼這是我第一次在google搜索一小時後看到這個lamdba選項... – Martin

+0

@Martin,或者,你可以定義另一個調用'load_file(area)'的函數(我們稱之爲'f')而不是'lambda',並將'f'作爲'command'參數傳遞。 – falsetru

2

應該command=lambda: load_file(area)

command=load_file(area)將調用load_file和返回值設置爲command