”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么我的 PyQt4 按钮点击信号在循环内总是输出相同的值?

为什么我的 PyQt4 按钮点击信号在循环内总是输出相同的值?

发布于2024-11-16
浏览:566

Why Does My PyQt4 Button Clicked Signal Always Output the Same Value Within a Loop?

在循环中连接 PyQt4 中的槽和信号

在 PyQt4 中,在槽和信号之间建立连接是事件处理的基本方面。但是,当尝试连接循环内按钮发出的多个信号时,可能会出现意外行为。

为了说明此问题,请考虑以下代码:

def __init__(self):
    for i in range(0, 10):
        self._numberButtons  = [QPushButton(str(i), self)]
        self.connect(self._numberButtons[i], SIGNAL('clicked()'), lambda: self._number(i))

def _number(self, x):
    print(x)

单击任何按钮后,无论按下哪个按钮,输出都会始终显示“9”。理解这种行为背后的原因需要探索 Python 的作用域规则的复杂性。

在 Python 中,变量的作用域由最近的封闭函数确定。在此示例中,lambda 函数和“_number”函数均在“__init__”函数中定义。由于每次迭代循环都会将相同的值 ('9') 分配给 'i',因此 lambda 函数始终捕获在 '__init__' 函数中分配给 'i' 的最后一个值,即 '9'。

要解决此问题,一种方法是将“i”作为关键字参数传递,并在 lambda 函数中使用默认值,确保为每个创建单独的“i”绑定instance.

self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))

或者,可以使用 functools.partial 创建一个将“i”绑定到与每个关联的特定值的专用函数Button.

self._numberButtons[i].clicked.connect(partial(self._number, i))

这些修改保证每个回调函数捕获'i'的正确值,启用对按钮点击的适当响应。

最新教程 更多>
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-16
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-11-16
  • 浏览器可以使用 JavaScript 建立原始 TCP 套接字连接吗?
    浏览器可以使用 JavaScript 建立原始 TCP 套接字连接吗?
    使用 JavaScript 从浏览器连接到 TCP 套接字:可能吗?要在浏览器和基于 TCP 套接字的服务器应用程序之间建立实时通信,您需要可以探索两种可行的方法:1. XHR 或 WebSocketsXHR (XMLHttpRequest) 和 WebSockets 都有助于浏览器和服务器之间的实...
    编程 发布于2024-11-16
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1和$array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求是构...
    编程 发布于2024-11-16
  • 如何使用系统凭据在 Go HTTP 请求中执行 NTLM 身份验证?
    如何使用系统凭据在 Go HTTP 请求中执行 NTLM 身份验证?
    使用系统凭证的 Go HTTP 请求中的 NTLM 身份验证在此问题中,用户寻求有关在 Go HTTP 中执行 Windows NTML 身份验证的指导使用调用用户的系统凭据进行请求。他们提供了 C# 和 Python 的示例,演示了如何在这些语言中实现此目的。解决方案在于利用 go-ole 库,该...
    编程 发布于2024-11-16
  • 如何确定我的 C/C++ 代码正在编译的 CPU 架构?
    如何确定我的 C/C++ 代码正在编译的 CPU 架构?
    针对特定 CPU 架构进行编译编写 C 或 C 代码时,通常需要了解您所针对的目标 CPU 架构编译。此信息可用于优化代码性能或确保与特定硬件的兼容性。不同的编译器利用各种非标准预处理器定义来区分 CPU 架构(例如,MSVS 中的 _M_X86、GCC 中的 i386__ 和 __arm)。标准检...
    编程 发布于2024-11-16
  • 如何在 Python 模块中模仿类行为?
    如何在 Python 模块中模仿类行为?
    使用 getattr在模块中动态实现类类行为 在某些情况下,可能需要模仿__getattr__ 对类的行为,但对整个模块的行为。这允许动态创建类实例并根据模块上的属性查找调用其方法。但是,尝试直接在模块上定义 __getattr__ 方法面临两个障碍:Python只检查类上的此类方法。修改底层模块类...
    编程 发布于2024-11-16
  • 如何在 Python 中创建真正独立的对象副本?
    如何在 Python 中创建真正独立的对象副本?
    在 Python 中复制对象:综合指南创建对象的副本是 Python 编程中的一项基本任务,尤其是在处理复杂数据时结构。本文深入研究了 Python 中对象复制的复杂性,特别关注创建不受原始对象更改影响的独立对象。浅复制和深复制在Python中,复制对象有两种主要方法:浅复制和深复制。浅复制创建一个...
    编程 发布于2024-11-16
  • 如何从 PHP 中的 SimpleXMLElement 提取内部 XML 内容?
    如何从 PHP 中的 SimpleXMLElement 提取内部 XML 内容?
    PHP SimpleXML:访问内部 XML在 PHP XML 解析领域,SimpleXML 扩展允许开发人员轻松操作 XML 文档。然而,提取 XML 元素的内部内容(排除周围的元素标签)可能具有挑战性。考虑以下 XML 片段:<qa> <question>Who ar...
    编程 发布于2024-11-16
  • Java 中的哪种字符串连接选项最适合您?
    Java 中的哪种字符串连接选项最适合您?
    理解 Java 中的字符串连接选项: 、 StringBuilder 和 concat在 Java 中,有多种连接字符串的选项:使用 ' ' 运算符、StringBuilder 类或 'concat' 方法。每个选项都有其优点和用例,我们将在下面探讨。何时使用 ...
    编程 发布于2024-11-16
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-16
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-16
  • 如何在Ubuntu上不输入密码安装MySQL?
    如何在Ubuntu上不输入密码安装MySQL?
    Ubuntu上的无密码MySQL安装问题:如何在Ubuntu上安装MySQL而无需在过程中输入密码?背景:使用 sudo apt-get install mysql 安装 MySQL 提示输入密码,可能不方便在非交互式场景中或编写安装脚本时。解决方案:要绕过密码提示,请使用以下脚本:#!/bin/b...
    编程 发布于2024-11-16
  • Go 的 DNS 解析功能是否具有缓存查找功能?
    Go 的 DNS 解析功能是否具有缓存查找功能?
    Go 的 DNS 解析功能有缓存查找吗?Go 编程语言的标准库缺乏通过 dnsclient 缓存 DNS 查找的内置机制。虽然缓存 DNS 响应可以通过减少昂贵的 DNS 查询数量来显着提高应用程序的效率,但 Go 目前不提供此功能。替代缓存解决方案由于 Go 不提供原生 DNS 缓存,因此开发人员...
    编程 发布于2024-11-16
  • 如何解决Java Web应用程序中的“java.lang.UnsatisfiedLinkError no *.dll in java.library.path”?
    如何解决Java Web应用程序中的“java.lang.UnsatisfiedLinkError no *.dll in java.library.path”?
    疑难解答“java.lang.UnsatisfiedLinkError no *.dll in java.library.path”问题应用使用 System.loadLibrary() 等静态链接方法在 Web 应用程序中包含自定义 DLL 并不总是那么简单。为了有效解决“java.lang.Un...
    编程 发布于2024-11-16

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3