wxPython中如何通过传入的对象名称字符串引用并操作对应控件对象?
报错核心原因
你碰到的问题本质是没搞对Python的属性查找规则:
- 你在函数里写的
self.objName,代码运行时会直接在类实例上查找字面对名叫objName的固定属性,根本不会读取形参objName里存的字符串值(比如你传的'myObject'、'myObject2')去匹配对应的实例属性。 - 因为你的类上从来没有定义过叫
objName的属性,自然就会抛出AttributeError: 'myProg' object has no attribute 'objName'。
具体解决方法
匹配你原本的传字符串思路:用getattr动态取对象
Python内置的getattr方法就是专门用来实现“把字符串当属性名,从实例上取出对应的真实对象”的,只需要修改writeLine函数内部逻辑就行,你原来的调用代码完全不用动:
def writeLine(self, str, objName): print(str) # 把传入的字符串当属性名,取出对应的单选按钮对象 target_ctrl = getattr(self, objName) target_ctrl.Enable(False) target_ctrl.SetValue(False)
改完之后,你原来的self.writeLine('hello', 'myObject')、self.writeLine('test', 'myObject2')这类调用就能正常运行了。
更推荐的写法:直接传对象实例入参
完全没必要靠传字符串绕一圈,直接把要操作的单选按钮对象本身当参数传进函数,代码的稳定性、可维护性会高很多:
- 调整调用处,把传字符串改成传实际的对象引用:
self.writeLine('hello', self.myObject) self.writeLine('test', self.myObject2) - 调整
writeLine函数,直接操作传入的对象就行:def writeLine(self, str, target_ctrl): print(str) target_ctrl.Enable(False) target_ctrl.SetValue(False)
这种写法的好处很直接:
- 杜绝硬编码字符串带来的拼写错误,比如不小心把'myObject'拼成'myObect'这类问题,靠getattr是没法在开发阶段提前发现的,IDE也不会对字符串内容做拼写检查
- 不要求所有单选按钮必须挂在self实例上,哪怕你把14个单选按钮存在列表、字典里统一管理,也可以直接把对应元素当参数传进函数
- 代码可读性更强,看函数签名就知道需要传入wx控件类型的对象,不需要额外记住固定的命名规则
代码小提醒:你示例里
self.myObject.GetValue():、self.myObject2.GetValue():末尾多了不必要的冒号,会触发Python语法错误,记得删掉。
内容的提问来源于stack exchange,提问作者jerrythebum
相关产品推荐
相关产品推荐

