函数 lambda 如何使用 kivy 访问我的循环或循环?
How can the function lambda access to my loop or loop using kivy?
我是 Kivy 的新手,Python 我正在尝试开发一个基于 Instagram 布局界面的应用程序。
首先,我定义了一个 class ImageButton,它将使我创建一个图像按钮:
class ImageButton(ButtonBehavior, Image):
pass
然后我使用这个 class 在网格中创建图像按钮。
这是我的代码:
class AllImage(BoxLayout):
# screen_manager = ObjectProperty()
def __init__(self, **kwargs):
BoxLayout.__init__(self, **kwargs)
self.orientation='vertical'
self.sizable_from = 'top'
splitter = Splitter(sizable_from = 'bottom')
root = ScrollView()
gridtest = GridLayout(cols=2, spacing=10)
layout = GridLayout(cols=4, spacing=10)
self.add_widget(splitter)
super(AllImage, self).__init__(**kwargs)
for im in IMAGES_NAMES:
if IMAGES_NAMES != None :
btn = ImageButton(source = im+'.png')
btn.bind(on_press= lambda a:gridtest.add_widget(ImageButton(source = im+'.png') ))
layout.add_widget(btn)
splitter.add_widget(gridtest)
root.add_widget(layout)
self.add_widget(root)
我当前的目标是在按下图像按钮时将网格 layout
中的图像按钮添加到网格 gridtest
中。
我现在遇到的问题是btn.bind(on_press= lambda a:gridtest.add_widget(ImageButton(source = im+'.png') ))
当我按下 ImageButton 时,我在第二个网格中没有我按下的图像,但在第一个网格中有最后一个图像。
我认为问题出在 lambda 上,因为它无法访问我的循环,而且我无法对其执行循环。
那么解决方案是什么?
Python 中的闭包(您在此处使用 lambda
创建)是后期绑定,调用函数时会查找该值(实际上,使用最后一个值作为循环变量(如果在循环中定义)。
解决方案是将 im
作为默认参数传递:
lambda a, im=im: # rest same
我是 Kivy 的新手,Python 我正在尝试开发一个基于 Instagram 布局界面的应用程序。
首先,我定义了一个 class ImageButton,它将使我创建一个图像按钮:
class ImageButton(ButtonBehavior, Image):
pass
然后我使用这个 class 在网格中创建图像按钮。 这是我的代码:
class AllImage(BoxLayout):
# screen_manager = ObjectProperty()
def __init__(self, **kwargs):
BoxLayout.__init__(self, **kwargs)
self.orientation='vertical'
self.sizable_from = 'top'
splitter = Splitter(sizable_from = 'bottom')
root = ScrollView()
gridtest = GridLayout(cols=2, spacing=10)
layout = GridLayout(cols=4, spacing=10)
self.add_widget(splitter)
super(AllImage, self).__init__(**kwargs)
for im in IMAGES_NAMES:
if IMAGES_NAMES != None :
btn = ImageButton(source = im+'.png')
btn.bind(on_press= lambda a:gridtest.add_widget(ImageButton(source = im+'.png') ))
layout.add_widget(btn)
splitter.add_widget(gridtest)
root.add_widget(layout)
self.add_widget(root)
我当前的目标是在按下图像按钮时将网格 layout
中的图像按钮添加到网格 gridtest
中。
我现在遇到的问题是btn.bind(on_press= lambda a:gridtest.add_widget(ImageButton(source = im+'.png') ))
当我按下 ImageButton 时,我在第二个网格中没有我按下的图像,但在第一个网格中有最后一个图像。
我认为问题出在 lambda 上,因为它无法访问我的循环,而且我无法对其执行循环。 那么解决方案是什么?
Python 中的闭包(您在此处使用 lambda
创建)是后期绑定,调用函数时会查找该值(实际上,使用最后一个值作为循环变量(如果在循环中定义)。
解决方案是将 im
作为默认参数传递:
lambda a, im=im: # rest same