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

时间:2020-04-17 13:05:40

标签: python button tkinter command

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

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'(列表中的最后一个值)。

您知道问题是什么吗?以及如何解决?

2 个答案:

答案 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()

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