如何将对象发送到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 在调用期间发送对象本身。