【问题标题】:How to set the variablee in a button command to own button's text in a loop that creates multipule buttons? [duplicate]如何在按钮命令中设置变量以在创建多个按钮的循环中拥有按钮的文本? [复制]
【发布时间】:2020-07-31 00:01:44
【问题描述】:

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

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

你知道问题是什么吗?我该如何解决?

【问题讨论】:

  • 你能告诉我你用来改变按钮文本的功能吗?我的意思是函数print_button_pressed_text
  • 我不能说它会解决你的问题,因为我还没有看到其他功能......到目前为止我发现了一个简单的问题......使用lambda解决它。 .. 像这样:b.configure(command=lambda: print_button_pressed_text(b.cget('text')))
  • @DaniyalAhmad 这个函数不会改变按钮的文本,它只是打印她给出的文本:def print_button_pressed_text(num): print num
  • @DaniyalAhmad 我使用了 Lambda,这就是它打印出来的结果。我忘了在我的问题中添加它。

标签: python button tkinter command


【解决方案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

【讨论】:

  • 处理程序是做什么的? @vitkarpov
  • 您只需要返回一个函数,以便 Button 实例之后可以使用它。您也可以使用 lambda 函数。
  • 哦,我看到你现在实际使用它了。
  • 是的 :( 你对如何修复此代码有其他想法吗?@vitkarpov
  • 没问题,伙计!这实际上是一个棘手的问题。一旦你明白了为什么你可能再也不会遇到它了。
【解决方案2】:

你不能使用join功能吗? 只需定义一个函数:

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

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

【讨论】:

  • 嘿,@TheMachinist,我想知道按下了哪个按钮,我该怎么做? (这将改变我拥有的 sqlite3 数据库表中的值)
  • 你能说得更具体些吗?我的意思是,你知道按下哪个按钮是什么意思?据我了解,这很简单,只需为每个按钮执行一个功能,当按下按钮时,它会放置 1 或 2 或者我不知道变量中的内容:/
  • 问题是我有很多按钮,我不知道我每次有多少按钮。 (因为每次调用feed_page() 时列表的长度都会改变)所以我不能为每个按钮创建一个函数@TheMachinist(我不知道要创建多少个函数)
  • 哦好的,我明白你的问题了...stackoverflow.com/questions/26765218/… ;)
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多