【问题标题】:unable to pass information to callback function无法将信息传递给回调函数
【发布时间】:2012-10-10 23:49:06
【问题描述】:

我正在使用 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 分钟后得到这个想法)。但这肯定不是唯一的方法吗?

【问题讨论】:

    标签: python lambda callback tkinter partial


    【解决方案1】:

    问题在于lambdapartial 在创建回调时评估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())
    

    【讨论】:

    • 谢谢。这完全解决了我一直遇到的问题。我应该自己尝试一下。:)
    猜你喜欢
    • 2021-09-04
    • 2012-02-14
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多