当前位置: 首页 > news >正文

pyqt 用lamada关联信号 传递参数 循环

在PyQt中,使用lambda函数来关联信号并传递参数是一个常见的做法,尤其是在需要为不同的对象实例关联不同的槽函数参数时。但是,需要注意的是,直接使用lambda可能会导致一些不易察觉的错误,尤其是当它在循环中使用时。这是因为lambda捕获的是变量的引用,而不是变量的值,这可能导致所有lambda函数都指向循环结束时变量的最终值。

下面是一个如何在PyQt中正确使用lambda来为循环中的多个按钮关联信号并传递不同参数的例子:

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

 

class Example(QWidget):

    def __init__(self):

        super().__init__()

        self.initUI()

 

    def initUI(self):

        for i in range(5):

            button = QPushButton(str(i), self)

            # 使用lambda,确保每次捕获i的当前值

            button.clicked.connect(lambda _, num=i: self.on_button_clicked(num))

 

    def on_button_clicked(self, num):

        print("Button number %d was clicked." % num)

 

if __name__ == '__main__':

    app = QApplication([])

    ex = Example()

    ex.show()

    app.exec_()

 

在这个例子中,lambda的第二个参数num=i确保了在每次循环迭代时,lambda捕获的是i的当前值,而不是引用。这意味着当按钮被点击时,on_button_clicked函数将接收到正确的按钮编号。

然而,使用lambda的这种方式并不是最优雅的解决方案。一个更Pythonic且避免lambda陷阱的方法是使用functools.partial:

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

from functools import partial

 

class Example(QWidget):

    def __init__(self):

        super().__init__()

        self.initUI()

 

    def initUI(self):

        for i in range(5):

            button = QPushButton(str(i), self)

            # 使用functools.partial来传递参数

            button.clicked.connect(partial(self.on_button_clicked, num=i))

 

    def on_button_clicked(self, num):

        print("Button number %d was clicked." % num)

 

if __name__ == '__main__':

    app = QApplication([])

    ex = Example()

    ex.show()

    app.exec_()

 

使用functools.partial避免了lambda的陷阱,并使代码更加清晰和可维护。

 

 

http://www.lryc.cn/news/429768.html

相关文章:

  • adb命令
  • Spring Boot项目热部署
  • Chat App 项目之解析(八)
  • CAAC无人机飞行执照:学习内容与考试流程详解
  • 苹果手机怎么连接蓝牙耳机?3个方案,3秒连接
  • CAD图纸加密软件有哪些?10款超级好用的CAD图纸加密软件推荐
  • 【html+css 绚丽Loading】000011 三元轮回珠
  • 算法学习018 求最短路径 c++算法学习 中小学算法思维学习 比赛算法题解 信奥算法解析
  • vue-element-admin——<keep-alive>不符合预期缓存的原因
  • 基于ElementPlus的分页表格组件ReTable
  • 力扣题/图论/课程表
  • SQL进阶技巧:基于指定规则的缺失值填充问题
  • 【气象百科】光伏自动气象站的功能优势
  • 嵌入式AI快速入门课程-K510篇 (第二篇 Ubuntu的基础操作)
  • android13隐藏调节声音进度条下面的设置按钮
  • Java ArrayList和LinkedList
  • STM32F030行列式按键扫描
  • FPGA 综合笔记
  • Android MVVM框架详解与应用
  • 浅析KHD-厨帽检测算法从源码到实际应用的方案
  • ESXi里的FreeBSD装bhyve Ubuntu子系统,外网不通,子系统里无法ping通外面(使用NAT解决)
  • Connectionist Logic Systems and Hybrid Systems by Translation
  • 盘点数据摆渡的8种常用方式 最推荐哪一种?
  • 仿照ContentLoadingProgressBar 的特点在Android项目中自定义Loading对话框
  • 基于数据复杂度的数据库选型
  • QT基础知识5
  • C++中vector存放内置数据类型
  • shell编程:安装部署前常见环境检查
  • 思特科技:国家宝藏数字体验馆展现东方美学 让“文物活起来”
  • ES6笔记总结(Xmind格式):第二天