PyQt循环绑定QLabel点击跳转时所有标签均跳转到最后一个链接问题
问题原因
你遇到的异常是Python闭包延迟绑定的特性导致的:循环内定义的lambda函数不会在定义阶段立即捕获link变量的当前值,只有当点击标签触发lambda执行时,才会读取link的实时值,此时循环已经全部执行完毕,link存储的就是最后一次循环的health分类第10条链接,因此所有标签点击都会跳转到同一个地址。
解决方案
只需要修改槽函数绑定逻辑即可,无需改动原有clickable封装,有两种常用实现方式:
方式1:lambda添加默认参数捕获当前值
默认参数会在函数定义时完成赋值,刚好可以锁定每次循环的link值,修改代码如下:
category = ['korea','world','buss','sci','enter','sport','health'] for cate in category: ca = globals()[cate] for n in range(10): a = getattr(self, "label_{}_{}".format(cate,n+1)) link = ca[n][1] # 给lambda添加默认参数link=link,锁定当前循环的链接值 clickable(a).connect(lambda link=link: webbrowser.open(link))
方式2:使用functools.partial绑定参数
这种方式逻辑更清晰,避免lambda默认参数可能出现的误用,首先导入依赖:
from functools import partial
再修改绑定逻辑:
category = ['korea','world','buss','sci','enter','sport','health'] for cate in category: ca = globals()[cate] for n in range(10): a = getattr(self, "label_{}_{}".format(cate,n+1)) link = ca[n][1] clickable(a).connect(partial(webbrowser.open, link))
内容的提问来源于stack exchange,提问作者황준석
相关产品推荐
相关产品推荐

