You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WxPython运行报AttributeError: 'Window' object has no attribute 'pressed'求助

问题根因

你把pressed方法定义在了__init__构造函数的内部,它属于__init__的局部函数,不属于Window类的成员方法,所以通过self.pressed调用的时候,Python找不到对应属性就抛出了AttributeError。

修复方案

修复后完整代码

import wx

class Window ( wx.Frame ):
    def __init__ ( self ):
        super().__init__ ( parent = None, title = "Hello World!" )
        
        panel = wx.Panel ( self )
        sizer = wx.BoxSizer ( wx.VERTICAL )
        
        self.TextBox = wx.TextCtrl ( panel, pos = ( 5, 5 ), style = wx.TE_MULTILINE | wx.TE_AUTO_URL )
        sizer.Add ( self.TextBox, 0, wx.ALL | wx.EXPAND, 5 )
        
        self.button = wx.Button ( panel, label = "Button", pos = ( 5, 40 ) )
        self.button.Bind ( wx.EVT_BUTTON, self.pressed )
        sizer.Add ( self.button, 0, wx.ALL | wx.CENTER, 5 )
        
        panel.SetSizer ( sizer )
        self.Show()
    
    # 把pressed方法移到__init__外面,作为Window类的成员方法
    def pressed ( self, event ):
        text = self.TextBox.GetValue()
        print ( text )

if __name__ == '__main__':
    app = wx.App()
    window = Window()
    app.MainLoop()

核心修改点

  • 将原本写在__init__内部的pressed函数移出,和__init__保持同级,成为Window类的公共成员方法,这样self.pressed就能正常访问到
  • 保留pressed方法的event参数即可,wxPython的事件绑定默认会传入事件对象,不需要删除

可选替代方案(不推荐,仅作原理说明)

如果你要保留pressed在__init__内部的写法,绑定时不需要加self.前缀,直接写函数名即可,同时可以去掉self参数,因为局部函数可以直接访问上层__init__的self变量:

# 仅修改__init__内的绑定和pressed定义部分
def pressed(event):
    text = self.TextBox.GetValue()
    print(text)
# 绑定时直接用函数名,不要加self.
self.button.Bind(wx.EVT_BUTTON, pressed)

这种写法不推荐是因为局部函数无法在类的其他方法中复用,而且不符合面向对象的代码规范。

内容的提问来源于stack exchange,提问作者TLS_R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:57:04