如何通过字符串名称设置QtRadioButton属性?locals()等方法遇阻
问题原因
你遇到的KeyError是因为self.radioButtonE是实例对象self的属性,并不在当前作用域的locals()字典里。之前用locals()能赋值,只是在当前作用域创建了一个新变量,并非修改self的属性——你打印的也是这个新变量,不是self对象的属性值。
正确实现方法
方法1:使用getattr()(推荐)
这是Python获取对象属性的标准方法,安全且可读性强,支持通过字符串动态获取属性:
typ = "E" # 获取对应的RadioButton对象 radio_btn = getattr(self, f"radioButton{typ}") # 设置属性 radio_btn.setEnabled(True)
如果担心属性不存在,可以添加默认值避免报错:
radio_btn = getattr(self, f"radioButton{typ}", None) if radio_btn is not None: radio_btn.setEnabled(True)
注意:如果你的控件是通过Qt Designer生成的,可能挂载在self.ui下,需要改成getattr(self.ui, f"radioButton{typ}")
方法2:直接操作实例的__dict__属性(不推荐)
实例的属性会存储在__dict__字典中,可以直接通过键名访问,但这种方式不够规范,不建议用于生产代码:
typ = "E" self.__dict__[f"radioButton{typ}"].setEnabled(True)
关于exec()的正确用法
如果你一定要用exec(),需要确保字符串代码的正确性,示例如下:
typ = "E" exec(f"self.radioButton{typ}.setEnabled(True)")
但exec()存在安全风险(若字符串来源不可控),且代码可读性、可维护性差,所以优先选择getattr()。
内容的提问来源于stack exchange,提问作者Stano
相关产品推荐
相关产品推荐

