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()
错误
AttributeError: '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()
从按钮的处理程序内部更改标签文本时出现问题(当我粘贴代码时间距弄乱了,但缩进正确)
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()
错误
AttributeError: '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()