PyQt中通过connect直接赋值变量报错的解决方案咨询
解决PyQt信号槽lambda中直接赋值报错的问题
这个坑我之前踩过!你遇到的Can't assign to function call错误,本质是Python的lambda语法限制——lambda里只能放单个表达式,而直接的变量赋值是一条语句,不是表达式,所以PyCharm会直接标红报错。
不想写自定义setter方法的话,有两个实用的办法:
方法1:用Python内置的setattr()函数
这是最推荐的方案,完全不用额外写方法,利用Python原生的属性设置函数就行。把你的代码改成这样:
self.button.clicked.connect(lambda: setattr(outside_object, "username", self.username))
setattr()的作用就是给对象设置属性,第一个参数是目标对象,第二个是属性名(字符串形式),第三个是要赋的值。这个写法完全符合lambda的表达式要求,而且可读性也不错。
方法2:用exec()执行赋值语句
如果实在想保留直接赋值的写法,可以把赋值语句包装成字符串传给exec():
self.button.clicked.connect(lambda: exec("outside_object.username = self.username"))
不过这个方法不太推荐,因为exec()执行字符串代码的可读性差,而且如果涉及动态生成的字符串还可能有安全风险,除非你特别偏好这种写法。
为什么原来的写法不行?
再啰嗦两句:Python里的lambda是表达式级别的语法,它的返回值是表达式的结果,而像a = b这种赋值是语句,不能出现在lambda的主体里。哪怕是Python3.8引入的赋值表达式:=,也只能用于表达式内部,没法直接用来给外部对象的属性赋值,所以上面两种方法是最直接的替代方案。
内容的提问来源于stack exchange,提问作者e15purple
相关产品推荐
相关产品推荐

