首页 > 解决方案 > Kivy 绑定动态按钮事件 - 始终只返回最后一项值

问题描述

创建按钮:

 loadElements = self.myStore.get('renderComponentArray')['elements']
        for item in loadElements:
            print("......", item['type'])
            if item['type'] == 'BUTTON':
                print('its button , coming from root editor layout , list in root also in sceneGUIContainer.->>>')
                # make it
                nameLoc =  item['name']
                idLoc = item['id']

                self.add_widget(Button(
                    markup=True,
                    text='[Button] [b]' + item['name'] + '[b]',
                    color=item['color'],
                    on_press=lambda *args: self.engineRoot.showDetails(nameLoc, idLoc, *args),  # self.engineRoot.showDetails(item),
                    size_hint=(1, None),
                    height=30
                ))

方法 :

  def showDetails(self, instance, name, ElementId):
        print("TEST DETAILS  test name-> ", name)
        print("TEST DETAILS  test id-> ", ElementId)

        # Clear
        try: self.editorElementDetails
        except NameError: self.editorElementDetails = None

        if self.editorElementDetails is None:
            print("..First time.")
        else:
            self.remove_widget(self.editorElementDetails)
            print("..RESET.")
        
        ## TEST DETAILS
        self.editorElementDetails = BoxLayout( orientation='vertical')
        self.detailsButtonNameText = TextInput(text='EMPTY', size_hint=(1, .1))
        self.editorElementDetails.add_widget(self.detailsButtonNameText)

        self.editorElementDetails.add_widget(
            Button(
                text="Name(Tag) " + name,
                size_hint=(1,.1) )
            )


        self.editorElementDetails.add_widget(
            Button(
                text="Text " + str(ElementId),
                size_hint=(1,.1) )
    )
        self.add_widget(self.editorElementDetails)


标签: python-3.xkivy

解决方案


这是一个典型的问题lambda。尝试partial改用:

            self.add_widget(Button(
                markup=True,
                text='[Button] [b]' + item['name'] + '[b]',
                color=item['color'],
                on_press=partial(self.engineRoot.showDetails, nameLoc, idLoc),
                size_hint=(1, None),
                height=30
            ))

showDetails()方法签名进行相应的更改:

def showDetails(self, name, ElementId, instance):
    print("TEST DETAILS  test name-> ", name)
    print("TEST DETAILS  test id-> ", ElementId)

推荐阅读