我正在使用Tkinter,python 2.7并且是gui编程的新手。我想将一个字符串传递给一个按钮中的回调函数。我已经尝试了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)使用lambda
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分钟得到了这个想法)。但这肯定不是唯一的方法吗?
答案 0 :(得分:2)
问题在于,lambda
和partial
同时在创建回调时评估aname
,而不是在实际调用它时进行评估。
对于partial
,您需要修改fetch_urls
函数以实际评估该值:
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())