如何在创建多个按钮的循环中将按钮命令中的变量设置为拥有按钮的文本?

How to set the variablee in a button command to own button's text in a loop that creates multipule buttons?

我有一个在包含列表值的标签下创建按钮的循环:

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_page() 时,列表 Feed 的长度和值都会改变。

我希望每次按下某个按钮时,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

你不能使用连接功能吗? 定义一个函数即可:

feed = ["Cooking", "Sports", "Tv", "Fashion"]
def print_the_list:
     global feed
     print(" ".join(feed))
print_the_list()

然后将此功能设置为按钮的命令。如果你想放 , 或 ;或元素之间的任何内容,将“ ”修改为“,”或“;”