如何将对象发送到on_press中编写的函数?
How to send an object to a function written in on_press?
他们有一个简单的模型
class Card_:
def __init__(self, numb, adr, text, date, st):
self.number = numb
self.adress = adr
self.text = text
self.date = date
self.status = st
有创建 MDlist 行的代码
for i, card in enumerate(_card_list):
print(card)
tabs_list[-1].ids.main_list.add_widget(ThreeLineAvatarIconListItem(text=f'Задача № {card.number}, {card.text}',
secondary_text=str(card.data),
tertiary_text=card.status,
on_press=lambda t: self.card_open(card)))
但是on_press我收到了'for'卡片对象中的最后一个
[INFO] [Base] 启动应用程序主循环
/在card_open/
中打印(卡片)
card_open 函数
def card_open(self, card):
print(card)
self.root.transition.direction = 'left'
self.root.current = 'card'
self.root.ids.content.title = f"Задача №{card.number}"
为什么我收到了 'for' 卡片对象中的最后一个?
我希望每一行都有自己的卡片
由于 late binding closures,您的 lambda 函数没有达到您的预期。
如果我没理解错的话,你的问题出在Python's lambda late binding。
定义闭包时,闭包的参数在调用时解析,而不是在定义时解析。因此,您需要另一种方式来存储与 ThreeLineAvatarIconListItem 关联的卡片。
第一个可能的解决方案有点老套但可用 - 您可以将“默认”参数作为同一对象提供给 lambda,它会起作用:
ThreeLineAvatarIconListItem(..., on_press=lambda t, card=card: self.card_open(card))
由此,您提供了在 lambda 定义期间解析的默认参数。
第二种(通常更有效)方法是将您的卡片本地保存在对象中并在 card_open 函数中使用此卡片:
...
for i, card in enumerate(_card_list):
print(card)
new_widg = ThreeLineAvatarIconListItem(...)
new_widg.card_inside = card
new_widg.on_press = lambda t: self.card_open(t)
tabs_list[-1].ids.main_list.add_widget(new_widg)
...
def card_open(self, widg):
card = widg.card_inside
...
这一切都假设 on_press 在调用期间发送对象本身。
他们有一个简单的模型
class Card_:
def __init__(self, numb, adr, text, date, st):
self.number = numb
self.adress = adr
self.text = text
self.date = date
self.status = st
有创建 MDlist 行的代码
for i, card in enumerate(_card_list):
print(card)
tabs_list[-1].ids.main_list.add_widget(ThreeLineAvatarIconListItem(text=f'Задача № {card.number}, {card.text}',
secondary_text=str(card.data),
tertiary_text=card.status,
on_press=lambda t: self.card_open(card)))
但是on_press我收到了'for'卡片对象中的最后一个
[INFO] [Base] 启动应用程序主循环
/在card_open/
中打印(卡片)card_open 函数
def card_open(self, card):
print(card)
self.root.transition.direction = 'left'
self.root.current = 'card'
self.root.ids.content.title = f"Задача №{card.number}"
为什么我收到了 'for' 卡片对象中的最后一个?
我希望每一行都有自己的卡片
由于 late binding closures,您的 lambda 函数没有达到您的预期。
如果我没理解错的话,你的问题出在Python's lambda late binding。 定义闭包时,闭包的参数在调用时解析,而不是在定义时解析。因此,您需要另一种方式来存储与 ThreeLineAvatarIconListItem 关联的卡片。
第一个可能的解决方案有点老套但可用 - 您可以将“默认”参数作为同一对象提供给 lambda,它会起作用:
ThreeLineAvatarIconListItem(..., on_press=lambda t, card=card: self.card_open(card))
由此,您提供了在 lambda 定义期间解析的默认参数。
第二种(通常更有效)方法是将您的卡片本地保存在对象中并在 card_open 函数中使用此卡片:
...
for i, card in enumerate(_card_list):
print(card)
new_widg = ThreeLineAvatarIconListItem(...)
new_widg.card_inside = card
new_widg.on_press = lambda t: self.card_open(t)
tabs_list[-1].ids.main_list.add_widget(new_widg)
...
def card_open(self, widg):
card = widg.card_inside
...
这一切都假设 on_press 在调用期间发送对象本身。