使用PyQT中的新式信号传递参数

2024-10-01 11:20:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在PyQT中动态创建一组按钮时,我遇到了一些问题。在

我使用一个列表来创建对应于不同值的按钮。因为每个按钮都是不同的,我需要让他们向“button Clicked”函数传递一个参数,分别标识自己,这样我就可以用它们执行不同的操作。以下是我目前所掌握的情况:

for x in self.buttons:
    name = str(x)
    button = QtGui.QPushButton(Frame)
    button.setText(name)
    cp_result = self.changeProject(name)
    if cp_result is None:
        print 'changeProject(%s) is None!', name
    else:
        print 'changeProject(%s) is OK (%r)', name, cp_result
        #button.clicked.connect(cp_result)
    setattr(self, "btn_%s" % name, button)
    self.btnList.append(button)

def changeProject(self, name):
    for x in self.btnList:
        if x.isDown:
            #Change UI Frame to blahblah
    return 'A String'

与Alex一起工作,这是最新的代码,测试changeProject的返回值,显然不能是字符串,但我仍然需要确定在自动生成的按钮之间按下了哪个按钮。在

当前错误:TypeError: connect() slot argument should be a callable or a signal, not 'str'


Tags: nameinselfnoneforifisbutton
3条回答

可以使用setattr向对象动态添加属性

for x in buttons:
    name = str(x)
    button = QtGui.QPushButton(Frame)
    button.setText(name)
    button.clicked.connect(self.changeProject(name))
    setattr(self, "btn_%s" % name, button)

我觉得你运行'exec'太多了,我觉得你的问题是你试图连接到QPushButton的.clicked(),这实际上是一个信号。你真的需要把论点传给这里吗

exec 'self.btn_%s.clicked.connect(self.changeProject("%s"))' % (x, x)

因为如果你不这样做,你可以这样连接:

self.connect(self.btn_%s, SIGNAL('clicked()'), self.changeProject)

如果您需要知道单击了哪个按钮,可以在列表中迭代以找到单击的按钮:

for x in buttons:
if x.isDown(): (function)


也可以使用pyqtSignal。在

错误消息告诉您的是,self.changeProject("%s")对于您要替换的其中一个值,%s返回{}。大概你是想让那个方法返回一些不同的东西?在

当然,如果没有看到它的代码,就不可能进一步帮助您完成调试changeProject的任务。但是,例如,你可以把电话分成如下几部分(一旦你按照lazy1的建议摆脱了大量的执行官):

cp_result = self.changeProject(name)
if cp_result is None:
    logging.error('changeProject(%s) is None!', name)
else:
    logging.info('changeProject(%s) is OK (%r)', name, cp_result)
    button.clicked.connect(cp_result)

这样,您就不会徒劳地尝试“connect to None”,而是会在错误日志中看到导致该错误的所有名称的返回值,然后可以根据该信息继续调试。然而,更有可能的是,通过查看changeProject的源代码,您的bug实际上可能变得明显。在

编辑:当然,connect的参数来自changeProject(而不是来自另一个{}!-)--相应地修复了代码段。在

相关问题 更多 >