为什么我无法将PyQt5按钮点击回调函数通用化?
报错原因
connect()方法要求传入可调用的函数/方法引用,不能直接写函数调用语句:你写的self.push(self, '0')会在代码执行到connect这一行时直接调用push方法,把方法的返回值(默认是None)传递给connect,完全达不到点击按钮触发方法的效果。- 参数计数错误的直接原因:类的实例方法通过实例调用时,
self是Python自动传入的,不需要你手动传递。你手动多写了一个self参数,加上Python自动传入的self、你写的字符参数,总共传了3个参数,但你的push方法只定义了self、c两个参数,因此触发参数数量不匹配的报错。
另外你提供的修改后代码还存在笔误:给button_1绑定信号的语句也写了self.button_0.clicked.connect,会导致两个信号都绑定到按钮0上。
正确实现方案
有两种常用的写法可以实现单方法适配所有按钮的需求:
方案1:使用lambda表达式包裹调用
不需要手动传递self,直接在lambda里调用push方法传入对应字符即可:
self.button_0.clicked.connect(lambda: self.push('0')) self.button_1.clicked.connect(lambda: self.push('1')) def push(self, c): t = self.display.toPlainText() self.display.setText(t + c)
方案2:使用functools.partial绑定参数
先导入partial工具,再绑定要传递的参数即可:
from functools import partial # 绑定信号部分 self.button_0.clicked.connect(partial(self.push, '0')) self.button_1.clicked.connect(partial(self.push, '1')) def push(self, c): t = self.display.toPlainText() self.display.setText(t + c)
内容的提问来源于stack exchange,提问作者Jacopo Bonanno
相关产品推荐
相关产品推荐

