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
相关产品推荐
相关产品推荐

