2

ここに初投稿。

映画のリストを作成しようとしています。ムービーは Tkinter のリストに表示されます。計画では、更新ボタンをクリックすると、プログラムはその横にあるラベルを更新します。問題は、どのボタンをクリックしても常に最後のラベルが更新されることです。これだからだと思います

lambda: self.update_rating(x)

は実行時に評価され、x も同様です。ボタンがクリックされたときに x が範囲外にあったものではなく、その特定のループにあったものにしたいのです。

私はpythonが初めてなので、助けていただければ幸いです

コード:

from Tkinter import *
class Application(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        self.create_widgets()
    def create_widgets(self):
        self.movies = list()
        for x in range(0, 10):
            movie = list()
            rating = Label(self, text = "Rating: NA")
            rating.grid(row = x, column = 0, columnspan = 1, sticky = W)
            movie.append(rating)
            update = Button(self, text = "update", command = lambda: self.update_rating(x))
            update.grid(row = x, column = 1, columnspan = 1, sticky = W)
            movie.append(update)
            self.movies.append(movie)
    def update_rating(self, num):
        self.movies[num][0]["text"] = "rating updated"
root = Tk()
root.title("Movie Sorter")
root.geometry("640x480")
app = Application(root)
root.mainloop()
4

1 に答える 1

2

代わりにこれを使用してください:

lambda x=x: self.update_rating(x)

デモンストレーション:

>>> x = 1
>>> a = lambda x=x:x
>>> a()
1
>>> x = 2
>>> a()
1

ここでの考え方は、関数が呼び出されたときに囲んでいるスコープから変数を取得することを評価するクロージャを作成するのではなく、関数が定義されたときにデフォルトの引数が評価されるということです。

于 2013-02-20T12:53:29.070 に答える