相关疑难解决方法(0)

Python Lambda循环

考虑以下代码段:

# directorys == {'login': <object at ...>, 'home': <object at ...>}
for d in directorys:
    self.command["cd " + d] = (lambda : self.root.change_directory(d))
Run Code Online (Sandbox Code Playgroud)

我希望创建一个包含两个函数的字典如下:

# Expected :
self.command == {
    "cd login": lambda: self.root.change_directory("login"),
    "cd home": lambda: self.root.change_directory("home")
}
Run Code Online (Sandbox Code Playgroud)

但看起来生成的两个lambda函数完全相同:

# Result :
self.command == {
    "cd login": lambda: self.root.change_directory("login"),
    "cd home": lambda: self.root.change_directory("login")   # <- Why login ?
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么.你有什么建议吗 ?

python loops anonymous-function

57
推荐指数
3
解决办法
2万
查看次数

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

我试图用PyQt4构建一个计算器并连接来自按钮的'clicked()'信号并不像预期的那样.我在for循环中为数字创建我的按钮,然后尝试连接它们.

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)
Run Code Online (Sandbox Code Playgroud)

当我点击按钮时,所有按钮都打印出'9'.为什么会这样,我该如何解决这个问题呢?

python signals-slots pyqt4

9
推荐指数
1
解决办法
4067
查看次数

Lambda中连接到pyqtSignal的对象的生命周期

假设我有一个对象,并且希望在发出PyQt信号时执行其方法之一。并假设我希望它使用未通过信号传递的参数来执行此操作。因此,我创建了一个lambda作为信号的插槽:

class MyClass(object):
    def __init__(self, model):
        model.model_changed_signal.connect(lambda: self.set_x(model.x(), silent=True))
Run Code Online (Sandbox Code Playgroud)

现在,通常使用PyQt信号和插槽,信号连接不会阻止垃圾收集。当连接的插槽的对象被垃圾回收时,发出相应信号时将不再调用该插槽。

但是,使用lambdas时如何工作?我没有存储对lambda的引用,但是信号插槽连接确实可以正常工作。因此,lambda不会被垃圾收集。

如果我现在将的实例设置MyClassNone,则该实例也不会被垃圾回收:发出model_changed_signal静止图像会成功执行lambda。因此,显然,对实例的引用MyClass保留在某个地方(也许是在lambda的上下文中)周围-我不希望这样。

为什么会这样?

python lambda garbage-collection pyqt signals-slots

5
推荐指数
1
解决办法
593
查看次数