You need to enable JavaScript to run this app. wxPython中如何通过传入的对象名称字符串引用并操作对应控件对象?
优惠活动
大模型
产品
解决方案
定价
更多

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')这类调用就能正常运行了。

更推荐的写法:直接传对象实例入参

完全没必要靠传字符串绕一圈,直接把要操作的单选按钮对象本身当参数传进函数,代码的稳定性、可维护性会高很多:

  1. 调整调用处,把传字符串改成传实际的对象引用:
    self.writeLine('hello', self.myObject)
    self.writeLine('test', self.myObject2)
    
  2. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 20:54:04