def feed_page():
feed = ["Cooking", "Sports", "Tv", "Fashion"] #let's say those are the list's values
l = len(feed) - 1
x = 0
while l >=0:
Label(app, text=feed[l]).grid(row=x, column=1)
b = Button(app, text=feed[l])
b.configure(command=lambda: print_button_pressed_text(b.cget('text')))
b.grid(row=x+1, column=1)
x += 2
*列表Feed
的长度和值在每次调用函数feed_page()
时都会改变。我希望每次按下特定按钮时,
print_button_pressed_text
功能将打印出该特定按钮的文本。 (每个按钮都有自己的唯一编号)
def print_button_pressed_text(num): print num
但是,无论我按什么按钮,该功能都会打印值'Fashion'
(列表中的最后一个值。)您知道问题是什么吗?以及如何解决?
def print_button_pressed_text(num):
def handler:
return num;
return handler;
UPD
问题是lambda函数查看错误的按钮,仅是最后一个,因为循环没有提供正确的作用域。
def make_button(text, row): b = Button(app, text=text) b.configure(command=lambda: print_button_pressed_text(b.cget('text'))) b.grid(row=x+1, column=1) return b while l >= 0: make_button(feed[l], x + 1) # ...
UPD2
为什么会发生?如果想进一步了解范围和闭包,请查看→https://louisabraham.github.io/articles/python-lambda-closures.html。>