循环更改按钮绑定功能

时间:2020-07-30 18:18:50

标签: python for-loop button kivy kivy-language

    sair_grid = self.root.ids["sairler_screen"].ids["sair_grid"]

    for a in dler:
        with open(a,"r",encoding="utf-8") as file1:
            for b in file1:
                btn = Button(text=b[:-5],on_press=lambda y:self.sairi(b))
                sair_grid.add_widget(btn)



def sairi(self,x):
    pass

无论我单击哪个按钮调用该函数,它都会产生相同的结果。我希望每个按钮都采用不同的b值,并使用不同的参数调用该函数。使用不同名称创建的所有按钮,但每个按钮都使用文件的最后一个参数调用。我是python和kivy的新手,因此,我们非常感谢每一个帮助。

1 个答案:

答案 0 :(得分:0)

这里只有一个名为b的变量,它会更改其值,直到最后一次执行循环时最后一个变量为止:

for b in file1:
    btn = Button(text=b[:-5],on_press=lambda y:self.sairi(b))
    sair_grid.add_widget(btn)

因此,您正在创建许多lambda,但是它们在闭包中都使用相同的b

该问题的典型简单解决方法是将b的当前值绑定到lambda参数的默认值:

for b in file1:
    btn = Button(text=b[:-5],on_press=lambda y, b=b:self.sairi(b))
    sair_grid.add_widget(btn)

现在,您创建的每个lambda都有一个本地绑定的b参数,该参数具有自己的默认值。现在,您创建的每个lambda的默认值b都不同。