2016-12-20 3 views
0

私はKivyとPythonが初めてで、Instagram Layoutインターフェイスに基づいたアプリケーションを開発しようとしています。関数lambdaはkivyを使用してループまたはループにアクセスできますか?

最初に私は私がイメージボタンを作成するようになりますクラスの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に押したときに、グリッドgridtestにグリッドlayoutでのImageButtonを追加することです: はここに私のコードです。

私は私が第二グリッドが、第一グリッドの最後の画像に押されたイメージを持っていないのImageButtonを押したとき、私が今直面しています問題はbtn.bind(on_press= lambda a:gridtest.add_widget(ImageButton(source = im+'.png'))) です。

私はループにアクセスすることができず、ループを実行できないため、ラムダから問題が発生していると思います。 解決策は何ですか?

答えて

0

(ここではlambdaで作成している)クロージャはレイトバインディングであり、関数が呼び出されるとルックアップされます(ループ内で定義されている場合はループ変数の最後の値を使用します)。

ソリューションは、デフォルトの引数としてimを渡すことです:それが動作

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

ありがとう:Dを –

関連する問題