python-3.x - 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)
解决方案
这是一个典型的问题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)
推荐阅读
- wpf - 基于资源字典中样式的按钮样式
- javascript - Angular 8 DomSanitizer 白名单?
- r - Stargazer 和 GAMM 模型
- python - 将多处理池应用于以多个列表作为参数的函数
- angular - 如何删除 TypeScript 自动导入中的“type”关键字?
- python - 将图像与屏幕图像匹配
- ios - 如何使用来自 URL 的图像以编程方式更改 iOS 应用程序图标?
- node.js - 您是否建议对托管在 Azure 应用服务上的应用程序使用像 bunyan 或 morgan 这样的记录器
- javascript - 使用钩子设置状态后运行函数
- spring-boot - 有没有使用 open-api 生成器从 yaml 文件生成 OAS3 html 的示例