1

私はTkinter、python 2.7を使用しており、GUIプログラミングは初めてです。ボタンのコールバック関数に文字列を渡したいのですが、functoolsからの部分関数とラムダ関数の両方を試しました。これまでのところ運がありません。だから私は何か間違ったことをしているに違いない。

    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_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分後にアイデアを得ました)。しかし、確かにこれが唯一の方法ではありませんか?

4

1 に答える 1

2

問題は、両方lambdaで、コールバックが実際に呼び出されたときに評価されるのではなく、コールバックが作成されたときに評価していることですpartialaname

の場合、実際に値を評価するように関数を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())
于 2012-10-11T00:28:32.113 に答える