Python循环生成卡片点击异常:始终触发最后一条数据
问题原因与解决方案
这是Python lambda在循环中的延迟绑定导致的问题:循环内定义的lambda并不会立即捕获当前迭代的ci值,而是持有对变量ci的引用。当循环结束后,ci最终指向最后一条记录的身份证号,因此无论点击哪个卡片,触发的lambda都会使用这个最终值。
以下是三种可行的解决方法:
方法1:利用lambda默认参数捕获当前值
修改on_click的lambda定义,通过默认参数把当前迭代的ci值固定下来:
on_click=lambda _, current_ci=ci: self.seleccionarJefe(current_ci)
默认参数会在lambda定义时(即每次循环迭代时)计算并保存当前的ci值,而非等到调用时再读取变量引用。
方法2:使用functools.partial固定参数
导入functools模块,用partial直接绑定固定参数:
from functools import partial # 循环内修改on_click配置 on_click=partial(self.seleccionarJefe, ci)
partial会将当前的ci值直接绑定到函数参数上,彻底避免引用延迟的问题。
方法3:封装成内部函数生成卡片
把创建卡片的逻辑拆成内部函数,利用闭包特性捕获当前值:
def generarCards(self, pagee): pagee = pagee cartas = [] querySelectJefe = "SELECT nombre, apellido, ci FROM jefesf" resultado = logica.consulta(querySelectJefe) def crear_carta(nom, ape, ci): return Container( bgcolor="RED", height=150, width=250, border_radius=border_radius.all(20), on_click=lambda _: self.seleccionarJefe(ci), content=Column( controls=[ Text(f"{nom} {ape}"), Text(f"{ci}"), ] ) ) for nom, ape, ci in resultado: cartas.append(crear_carta(nom, ape, ci)) pagee.update() return cartas
每次调用crear_carta时,函数参数ci会保存当前迭代的数值,lambda引用的是这个局部变量,不会受后续循环的影响。
内容的提问来源于stack exchange,提问作者Diego Marin
相关产品推荐
相关产品推荐

