我有一个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()
1条答案
按热度按时间s1ag04yj1#
这样,您为每个按钮定义了具有相同主体
print(dish)
的匿名函数。每次单击时都会评估函数。因此,所有按钮都将执行print(dish)
,其中dish
是变量。无论您为该变量分配了什么,所有按钮都将打印该值。在您的情况下,最后一个分配给变量dish
的值是'salad'
。这就是为什么所有的按钮都输出'salad'
。这看起来可能很奇怪,但实际上变量dish
在for循环之外也可用。Python不会在for循环结束时销毁这个变量。这是Python的一种行为。为了得到你所需要的,我建议更换行:
与
因此,每个函数都将获得
self
作为函数参数(self
=您刚刚单击的按钮示例),然后您就可以打印按钮的文本属性。