当前位置: 首页 > 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的陷阱,并使代码更加清晰和可维护。

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 富格林金业:注意避免曝光交易黑幕
  • python深度学习框架——TensorFlow
  • 企业如何通过费用专项分析节约成本?BI大神带你实操数据分析过程!
  • 【MySQL】MySQL学习笔记(持续更新)
  • Linux搭建环境:从零开始掌握基础操作(三)
  • Python之列表解析和用matplotlib模块绘制图形
  • LeetCode面试题Day15|LC219 存在重复元素Ⅱ、LC229 汇总区间
  • 高考杂志社《高考》杂志社高考杂志社编辑部2024年第22期目录
  • 客车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型
  • 微服务事务管理
  • Qt5.14.2 多边形与多边形求交集
  • GPT4的代码生成能力能不能取代一个月薪5000水平的码农?
  • 大象机械臂myCobot 280 JN 2023和D435i相关环境配置
  • Spring Boot 中的 starter 是什么
  • 大脑可视化:多种方式实现fMRI的ROI的绘图
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 《深入 React 技术栈》
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • egg(89)--egg之redis的发布和订阅
  • Gradle 5.0 正式版发布
  • JavaScript异步流程控制的前世今生
  • Java到底能干嘛?
  • java概述
  • Making An Indicator With Pure CSS
  • Netty 4.1 源代码学习:线程模型
  • Nodejs和JavaWeb协助开发
  • Swift 中的尾递归和蹦床
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 深度学习中的信息论知识详解
  • 详解移动APP与web APP的区别
  • 《天龙八部3D》Unity技术方案揭秘
  • !!java web学习笔记(一到五)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C++哈希表01)
  • (安卓)跳转应用市场APP详情页的方式
  • (第一天)包装对象、作用域、创建对象
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (生成器)yield与(迭代器)generator
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .bat批处理(一):@echo off
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET MVC第三章、三种传值方式
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • @ComponentScan比较
  • @GetMapping和@RequestMapping的区别
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ Linux ] Linux信号概述 信号的产生
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改