2012-10-10 27 views
1

我正在使用Tkinter,python 2.7,並且是gui編程的新手。我想將一個字符串傳遞給一個button中的回調函數。我已經嘗試了functools和lambda函數的一部分。到目前爲止沒有運氣。所以我一定在做錯事。無法將信息傳遞給回調函數

def fetch_urls(name): 
     print name   

    root=Tk() 
    aname=StringVar() 
    E1 = Entry(root, bd =5,textvariable=aname,justify=CENTER,width=20) 
    E1.grid(row=0,column=1,columnspan=3) 

    fetchbutton=Button(root,text ="FETCH",command =fetch_urls) 
    fetchbutton.grid(row=7,column=0) 

我基本上要爲發送字符串在aname即在輸入構件E1的功能fetch_urls文本。我試圖與使用利用沒有成功

1)拉姆達

anime=aname.get() 
    lambdafetch=lambda: fetch_urls(anime) 
    fetchbutton=Button(root,text ="FETCH",command =lambdafetch) 

2)部分從functools

anime=aname.get() 
    parfetch=partial(fetch_urls,anime) 
    fetchbutton=Button(root,text ="FETCH",command =parfetch) 

在兩種情況下該字符串不傳遞給函數以下。我想知道我做錯了什麼,以及如何使它工作。

def fetch(): 
     fetch_urls(aname.get()) 
    fetchbutton=Button(root,text ="FETCH",command =fetch) 

這是有效的(在發佈問題後有15分鐘的想法)。但肯定這不是唯一的方法?

回答

2

問題在於,在lambdapartial這兩種情況下,您在創建回調時都會評估aname,而不是在實際調用時進行評估。

對於partial,你就需要修改fetch_urls功能實際上EVAL值:

def fetch_urls(aStringVar): 
    print aStringVar.get() 

parfetch = partial(fetch_urls, aname) 

對於lambda,只是還就評估對象:

lambdafetch = lambda: fetch_urls(aname.get()) 

但我傾向於不使用lambda進行回調,因爲您可能遇到範圍問題。您可能必須使用一種技巧來「捕獲」aname對象:

lambdafetch = lambda s=aname: fetch_urls(s.get()) 
+0

謝謝。這完全解決了我一直有的問題。我應該自己嘗試。:) – thekindlyone