wxPython 对象没有属性

wxPython Object has no Attribute

从按钮的处理程序内部更改标签文本时出现问题(当我粘贴代码时间距弄乱了,但缩进正确)

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((400, 300))
        self.panel_1 = wx.Panel(self, wx.ID_ANY)
        self.text = wx.TextCtrl(self.panel_1, wx.ID_ANY, "")
        self.button = wx.Button(self.panel_1, wx.ID_ANY, "Change Label\n")
        self.__set_properties()
        self.__do_layout()
    
        self.Bind(wx.EVT_BUTTON, self.button_pressed_handler, self.button)
    
    def __set_properties(self):
        self.SetTitle("frame")
    
    def __do_layout(self):
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_1 = wx.GridSizer(2, 2, 0, 0)
        label = wx.StaticText(self.panel_1, wx.ID_ANY, "label_1")
        grid_sizer_1.Add(label, 0, 0, 0)
        grid_sizer_1.Add(self.text, 0, 0, 0)
        grid_sizer_1.Add(self.button, 0, 0, 0)
        self.panel_1.SetSizer(grid_sizer_1)
        sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        self.Layout()
    
    def button_pressed_handler(self, event):
        #Here is where i get the issue, how do i change the variable set in __do_layout?
        self.label.SetValue('changed')
        event.Skip()

错误

A​​ttributeError: 'MyFrame' 对象没有属性 'label'

FULL TRACE 减去文件位置内容:

第 34 行,在 button_pressed_handler self.label.SetValue('changed') AttributeError: 'MyFrame' 对象没有属性 'label'

如我的评论所述:
在 do_layout 中你定义了一个叫做 label 的东西,而在 button_pressed_handler 中它变成了 self.label。实际上,原始标签是局部变量而不是实例变量。

将 do_layout 中的标签更改为 self.label,并将那里的 sizer 条目也更改为 self.label。

您还需要将更新更改为 self.label.SetLabel('changed') 而不是 self.label.SetValue('changed'),因为 StaticText 没有 SetValue 功能。

import wx

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((400, 300))
        self.panel_1 = wx.Panel(self, wx.ID_ANY)
        self.text = wx.TextCtrl(self.panel_1, wx.ID_ANY, "")
        self.button = wx.Button(self.panel_1, wx.ID_ANY, "Change Label\n")
        self.__set_properties()
        self.__do_layout()
    
        self.Bind(wx.EVT_BUTTON, self.button_pressed_handler, self.button)
    
    def __set_properties(self):
        self.SetTitle("frame")
    
    def __do_layout(self):
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_1 = wx.GridSizer(2, 2, 0, 0)
        #label = wx.StaticText(self.panel_1, wx.ID_ANY, "label_1")
        self.label = wx.StaticText(self.panel_1, wx.ID_ANY, "label_1")  # Change this
        #grid_sizer_1.Add(label, 0, 0, 0)
        grid_sizer_1.Add(self.label, 0, 0, 0)                           # and change this
        grid_sizer_1.Add(self.text, 0, 0, 0)
        grid_sizer_1.Add(self.button, 0, 0, 0)
        self.panel_1.SetSizer(grid_sizer_1)
        sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        self.Layout()
    
    def button_pressed_handler(self, event):
        #Here is where i get the issue, how do i change the variable set in __do_layout?
        #self.label.SetValue('changed')
        self.label.SetLabel('changed')                                  # Change this to SetLabel
        event.Skip()

if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(None)
    frame.Show()        
    app.MainLoop()