weixin_42137986 2022-07-13 13:28 采纳率: 100%
浏览 31
已结题

求解PyQt5信号连接中lambda函数的参数在调用时改变的原因

问题遇到的现象和发生背景

初学python,遇到个小问题,代码如下。
字符串变量some_str在定义信号连接之后,值会改变。
我希望按下按钮时,用匿名函数打印变量some_str的初始值,而不是改变后的值。
我弄了几个按钮来尝试这个功能,其实已经解决了,用btn3的方案就行。
问题是,btn1的lambda local_var=some_str: print(local_var)并没有正确地保存local_var的初始值,在调用时变成False了。
这是为什么?

问题相关代码,请勿粘贴截图
import functools
import os
from PyQt5 import QtWidgets


class MainWidget(QtWidgets.QWidget):

    def __init__(self, parent=None):
        super(MainWidget, self).__init__(parent)
        layout = QtWidgets.QGridLayout(self)

        # 定义按钮
        self.btn0 = QtWidgets.QPushButton(text='按钮0')
        self.btn0.setObjectName('btn0')
        layout.addWidget(self.btn0, 0, 0)
        self.btn1 = QtWidgets.QPushButton(text='按钮1')
        self.btn1.setObjectName('btn1')
        layout.addWidget(self.btn1, 1, 0)
        self.btn2 = QtWidgets.QPushButton(text='按钮2')
        self.btn2.setObjectName('btn2')
        layout.addWidget(self.btn2, 2, 0)
        self.btn3 = QtWidgets.QPushButton(text='按钮3')
        self.btn3.setObjectName('btn3')
        layout.addWidget(self.btn3, 3, 0)

        # 变量初始值
        some_str = 'a'
        print('变量some_str的初始值为:', some_str)

        # 信号连接
        self.btn0.clicked.connect(lambda: print(some_str))
        self.btn1.clicked.connect(lambda local_var=some_str: print(local_var))
        self.btn2.clicked.connect(eval(f'lambda: print(\'{some_str!s}\')'))
        self.btn3.clicked.connect(
            functools.partial(lambda arg: print(arg), some_str))

        # 修改变量
        some_str = 'b'
        print('变量some_str修改后值为:', some_str)

        print('我希望按下按钮时,用匿名函数打印变量some_str的初始值')
        print('==========')


if __name__ == '__main__':
    import sys

    os.chdir(os.path.dirname(__file__))
    app = QtWidgets.QApplication(sys.argv)
    main_w = MainWidget()
    main_w.show()
    sys.exit(app.exec_())
运行结果及报错内容

几个按钮的返回值:
按钮0返回b(错误),因为调用lambda时some_str的值已经改成了b。
按钮1返回False(错误),我认为应该保存了定义时上下文的变量值,但奇怪的是,调用时这个值变成False了,为啥?
按钮2返回a(正确),代码太丑。
按钮3返回a(正确),最终采用。

我的解答思路和尝试过的方法
我想要达到的结果

我想搞清楚按钮1的local_var到底为啥会变成False。

  • 写回答

1条回答 默认 最新

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 系统已结题 7月22日
      • 已采纳回答 7月14日
      • 创建了问题 7月13日

      悬赏问题

      • ¥15 list的ad方法出错求解答
      • ¥20 关于mmap将物理空间映射到用户空间再落盘时使用O_DIRECT方式会提示bad address的问题如何解决?
      • ¥15 无人机px4下载环境编译出错,如何解决?
      • ¥15 您好,请问您的那个pcap转成pcd文件的matlab代码我下载了运行没问题,也生成了点云图,但是无法存储pcd文件,请问怎么保存导出pcd文件呀
      • ¥260 已有标注好的图像数据集,如何构建深度卷积网络训练分类
      • ¥20 matlab图像错误
      • ¥30 如何写通过uni.uploadFile上传图片到ASP后端接收的代码
      • ¥15 selenium模糊定位
      • ¥15 硬件断点的问题,真的被整无语了
      • ¥30 想入门网络编程求建议