我有一个循环,可在包含列表值的标签下创建一个按钮:
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'
(列表中的最后一个值)。
您知道问题是什么吗?以及如何解决?
答案 0 :(得分:1)
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。
答案 1 :(得分:0)
不能使用join功能吗? 只需定义一个函数即可:
feed = ["Cooking", "Sports", "Tv", "Fashion"]
def print_the_list:
global feed
print(" ".join(feed))
print_the_list()
然后将此功能设置为按钮的命令。如果你想放,或;或元素之间的所需内容,请将“”修改为“”或“;”