1

私は一連の壁紙画像を表示し、ユーザーがアプリの背景として1つを選択できるようにするアプリケーションに取り組んでいます。

アプリケーションはディレクトリを読み取り、ディレクトリ内のすべての.JPG画像を表示します。したがって、ユーザーが不確定な長さのオプションのリストから任意のオプションをクリックできるようにする必要があります。

問題は、リスト内の壁紙をクリックすると、リスト内の最後の壁紙に変更するオプションが渡されるだけです(つまり、ループ変数が繰り返され、呼び出されたメソッドでループ変数の値をキャプチャする必要があります)タグを割り当てる反復で)。

コードの関連するチャンクは次のとおりです。

for i in range(0,(howManyWalls-1)):
    #Update position
    if i % 3 == 0:
        startX=x0+10
        startY=startY+160
    else:
        startX=startX+160

self.options.append(Image.open("../includes/wallpaper/wall"+str(i+1)+".jpg"))
self.options[i].thumbnail((150,150),Image.ANTIALIAS)
self.optionThumbs.append(ImageTk.PhotoImage(self.options[i]))
self.optionThumbsDisp.append(canvas.create_image(startX,startY,anchor=NW, image=self.optionThumbs[i]))
canvas.tag_bind(self.optionThumbsDisp[i],"<Button-1>", lambda x: self.changeWallpaper(canvas,w,h,(i+1)))
4

1 に答える 1

2

これは実際、ラムダを使用するときによく聞かれる質問です。誤解はi、ラムダ関数内の変数が外部の変数とは何らかの形で異なるというものですi。言い換えれば、あなたはこのようなことをしているのです:

i=3
def foo():
    print i
i=4
foo()  #prints 4, when you expected 3

通常の関数に関して、iの値を「フリーズ」する1つの方法は、関数の作成時に評価されるため、キーワード引数を使用することです。

i=3
def foo(i=i):
    print i
i=4
foo()  #prints 3, you're happy now.

同じことがラムダ関数にも適用できます。

canvas.tag_bind(self.optionThumbsDisp[i],"<Button-1>", lambda x,i=i: self.changeWallpaper(canvas,w,h,(i+1))

今、(うまくいけば)それは動作します。

于 2012-07-19T17:29:54.900 に答える