【问题标题】:Use value of variable without using a pointer to the variable in python [duplicate]在python中使用变量的值而不使用指向变量的指针[重复]
【发布时间】:2018-06-24 16:19:22
【问题描述】:

我有一个 tkinter 按钮列表,它们创建一个对话窗口并允许用户输入文本,这将是按钮的新文本。但是我似乎无法弄清楚如何让每个按钮自行更新。我的代码如下

myButtons = []
timeSlots = []

while startH < endH:
    timeSlots.append(str(startH) + ":00")
    timeSlots.append(str(startH) + ":15")
    timeSlots.append(str(startH) + ":30")
    timeSlots.append(str(startH) + ":45")
    startH += 1

for x in range(len(timeSlots)):
    Label(frame, text=timeSlots[x]).grid(row=x, column=0)
    z = Button(frame, text="Nothing Scheduled", command=lambda: dialogMain(myButtons[x]))
    z.grid(row=x, column=1)
    myButtons.append(z)

对 dialogMain 的调用打开了用户输入文本的窗口,参数是它要更新的按钮。当然,问题在于,虽然所有按钮都出现在正确的位置,但当我单击任何按钮时,它只会更新最后一个,即 x 的当前值。是否可以只存储 x 的值,而不是指向 x 的指针,我认为这是问题所在 command=lambda: dialogMain(myButtons[x])。我尝试添加一个仅接收 x 的辅助函数,将其分配给一个新变量并将其作为对 dialogMain 的命令调用中的索引返回,但似乎在单击按钮之前不会调用该函数,让我一样的问题。如果有一种方法可以引用按钮本身也可以,并且我已经尝试过类似下面的代码,但它仍然只更新最后一个按钮。

z = Button(frame, text="Nothing Scheduled")
z["command"] = lambda: dialogMain(z)
z.grid(row=x, column=1)
myButtons.append(z)

窗口工作正常,看起来像, this,但只会更新底部按钮

【问题讨论】:

    标签: python list tkinter reference


    【解决方案1】:

    你的问题是关于binding lambda in a loop

    恕我直言,一个好的解决方案是制作一个返回绑定函数的 lambda:

    on_click = lambda button: lambda : DialogMain(button)
    for x in range(len(timeSlots)):
        ... command = onclick(myButtons[x])
    

    【讨论】:

    • 谢谢。根据索引,您的代码仍然给了我一个错误,但链接真的很有帮助,我最终得到了command=lambda i=x: dialogMain(myButtons[i]),它有效。
    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2017-02-13
    • 2016-05-29
    • 2020-12-30
    • 2016-10-25
    • 1970-01-01
    相关资源
    最近更新 更多