我总是得到相同的(最后添加的)值,尝试得到kivy的按钮文本,使用python 3

l7wslrjt  于 2023-01-27  发布在  Python
关注(0)|答案(1)|浏览(126)

我有一个python3脚本,在一个Kivy应用程序中,我用一些按钮填充一个Boxlayout,使用for循环从列表中设置按钮文本。我想得到正确的按钮的文本点击每个按钮,但我总是得到相同的一个。最后一个。我的小代码:

dishes=['spaghetti','rice','fish','salad']
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
class app(App):
    def build(self):
        self.box=BoxLayout()
        for dish in dishes:
            self.box.add_widget(Button(text=dish,on_press=lambda *args:print(dish)))
        return self.box
app().run()
s1ag04yj

s1ag04yj1#

这样,您为每个按钮定义了具有相同主体print(dish)的匿名函数。每次单击时都会评估函数。因此,所有按钮都将执行print(dish),其中dish是变量。无论您为该变量分配了什么,所有按钮都将打印该值。在您的情况下,最后一个分配给变量dish的值是'salad'。这就是为什么所有的按钮都输出'salad'。这看起来可能很奇怪,但实际上变量dish在for循环之外也可用。Python不会在for循环结束时销毁这个变量。这是Python的一种行为。
为了得到你所需要的,我建议更换行:

self.box.add_widget(Button(text=dish,on_press=lambda *args:print(dish)))

self.box.add_widget(Button(text=dish,on_press=lambda self:print(self.text)))

因此,每个函数都将获得self作为函数参数(self =您刚刚单击的按钮示例),然后您就可以打印按钮的文本属性。

相关问题