2016-12-20 10 views
0

Я новичок в Kivy и Python, и я пытаюсь разработать приложение, основанное на интерфейсе Instagram Layout.Как функция лямбда-доступа к моей петле или петле с использованием киви?

Сначала я определил класс ImageButton, который заставит меня создать изображение кнопки:

class ImageButton(ButtonBehavior, Image): 
    pass 

Тогда я использовал этот класс для создания кнопки изображения в сетке. вот мой код:

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) 

Моя текущая цель состоит в том, чтобы добавить ImageButton в сетке layout к сетке gridtest, когда я нажимаю на ImageButton.

Проблема, с которой я столкнулся, теперь btn.bind(on_press= lambda a:gridtest.add_widget(ImageButton(source = im+'.png'))) Когда я нажимаю ImageButton, у меня нет изображения, которое я нажал во второй сетке, но последнее изображение в 1-й сетке.

Я думаю, проблема связана с лямбдой, потому что у нее нет доступа к моей петле, и я не могу сделать цикл на ней. Так в чем же решение?

ответ

0

Закрытие в Python (которое вы создаете с помощью lambda здесь) являются поздними связями, значение вызывается при вызове функции (фактически, используя последнее значение для переменной цикла, если оно определено в цикле).

Решение передать im в качестве аргумента по умолчанию:

lambda a, im=im: # rest same 
+0

Благодаря она работает: D –