在PyQt中创建动态按钮

7

我试图在一个PyQt类中添加一个函数,但它总是返回错误。

# Error: TypeError: connect() slot argument should be a callable or a signal, not 'NoneType' # 

def commander (self, arg):
    exec arg    

def aButton (self, layout, **kwargs):
    name = kwargs.pop("name","Button")
    command = kwargs.pop("command", "" )
    button = QtGui.QPushButton(name)
    button.clicked.connect(self.commander(command))
    layout.addWidget(button)
    return button

也许这里有人可以帮我解决这个问题:') 谢谢!
2个回答

27
您需要一个函数:
button.clicked.connect(lambda: self.commander(command))

请注意lambda表达式将避免函数调用的评估,因此它只会在被点击时调用self.commander(command)


你能详细解释一下吗?我的意思是这个解决方案可以工作,但我不知道为什么... - SKYnine
@SKYnine 如果你跳过 lambda,那个代码块 self.commnader(command) 将在表达式中被评估,之后不会再次执行。结果(无论是什么)将传递给 connect 方法。使用 lambda,你将告诉解释器这是一段稍后要执行的代码(因此它将成为只有一个语句的函数)。然后将该函数传递给 connect 方法。 - JBernardo

2
似乎在技术领域中出现了这样的情况。
button.clicked.connect(self.commander(command))

self.commander(command) 返回的是 None 而不是一个信号或可调用对象。


是的,但我只想在按钮被点击时执行一些代码。我不明白需要返回什么样的值。 返回编译(arg,'<input>','exec')。 我尝试了一下,但结果还是一样... - MObject

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接