小能豆

Python‘使用错误的参数类型调用’错误

py

我明白为什么会出现此错误,它正在查找我的对象作为参数,并接收字符串值。但我不知道解决方案是什么?

以下代码片段只是尝试运行此命令;

self.buttonGroup.addButton(self.ui.m001)

x number of times:

num = 0
range_ = 10
prefix = "m"

for i in range (range_):
    if num <(range_-1):
        numString = "00"+str(num)
        if (num >9):
            numString = "0"+str(num)

        button = "self.ui."+prefix+numString

        self.buttonGroup.addButton(button)
        num +=1

print self.buttonGroup

阅读 26

收藏
2024-12-03

共1个答案

小能豆

根据您提供的代码和描述,似乎您希望动态地为一个按钮组添加多个按钮。问题的关键在于 self.ui.m001 是一个具体的对象(如按钮),而 button = "self.ui."+prefix+numString 是一个字符串("self.ui.m001"),这两个不能直接互换。

您正在将按钮的名称作为字符串处理,但实际上应该是访问对象实例。Python 中的 eval()getattr() 函数可以帮助您动态地获取对象。

解决方案:

使用 getattr() 来访问 self.ui 中的属性,而不是将其作为字符串拼接。getattr() 允许您通过属性名字符串动态地获取属性。

以下是修改后的代码:

num = 0
range_ = 10
prefix = "m"

for i in range(range_):
    if num < (range_ - 1):
        numString = "00" + str(num)
        if num > 9:
            numString = "0" + str(num)

        # 动态构建属性名
        button_name = prefix + numString

        # 使用getattr获取实际的按钮对象
        button = getattr(self.ui, button_name)

        # 将按钮添加到按钮组
        self.buttonGroup.addButton(button)
        num += 1

print(self.buttonGroup)

解释:

  1. 动态生成属性名
  2. button_name = prefix + numString 会根据 num 的值动态生成按钮的名称(如 m001m002,等等)。

  3. 使用 getattr() 获取对象

  4. button = getattr(self.ui, button_name) 通过属性名字符串(button_name)动态地从 self.ui 中获取相应的按钮对象(如 self.ui.m001)。
  5. getattr() 的第二个参数是可选的,如果未找到该属性,它将抛出 AttributeError。但在这个示例中,我们假设 self.ui 中确实有这些按钮。

  6. 添加按钮到按钮组

  7. 使用 self.buttonGroup.addButton(button) 将按钮添加到按钮组中。

注意:

  1. 确保 self.ui 中有您要访问的按钮(m001, m002, 等等)。
  2. 如果没有找到相应的按钮,getattr() 会抛出 AttributeError。您可以添加一个默认值或错误处理来避免这种情况,例如:

python button = getattr(self.ui, button_name, None) if button: self.buttonGroup.addButton(button)

这样就可以正确地动态地访问和使用对象,而不是字符串。

2024-12-03