关于python:无法将信息传递给回调函数

unable to pass information to callback function

我使用的是tkinter、python 2.7,并且是GUI编程的新手。我想给按钮中的回调函数传递一个字符串。我已经尝试了functools和lambda函数的部分。到目前为止还没有运气。所以我一定是做错了什么。

1
2
3
4
5
6
7
8
9
10
    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)

我基本上想要的是用一个名称(即条目小部件e1中的文本)将字符串发送到函数fetch_URL。我尝试过以下方法但没有成功

1)使用λ

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

2)使用functools的分部

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

在这两种情况下,字符串都不会传递给函数。我想知道我做错了什么,以及如何让它起作用。

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

这是可行的(在发布问题15分钟后得到了这个想法)。但这肯定不是唯一的办法吗?


问题是,对于lambdapartial,您在创建回调时对aname进行评估,而不是在实际调用回调时进行评估。

对于partial,您需要修改fetch_urls函数来实际计算值:

1
2
3
4
def fetch_urls(aStringVar):
    print aStringVar.get()  

parfetch = partial(fetch_urls, aname)

对于lambda,只需对对象进行评价即可:

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

但我倾向于不使用lambda进行回调,因为您可能会遇到范围问题。您可能需要使用一个技巧来"捕获"aname对象:

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