Возникли проблемы с изменением текста метки внутри обработчика для кнопки (интервал перепутался, когда я вставил код, но он имеет правильный отступ)
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» не имеет атрибута «метка»
FULL TRACE за вычетом информации о расположении файла:
строка 34, в button_pressed_handler self.label.SetValue («изменено») AttributeError: объект «MyFrame» не имеет атрибута «метка»
Я заметил, что в строке self.label...
вы на самом деле не определили, что такое self.label
в вашем коде.
поэтому вместо того, чтобы определять его в do_layout и пытаться взаимодействовать с ним через это, я должен просто переместить его в __init?
self.label пытается получить доступ к переменной label, расположенной в __do_layout
в do_layout
вы определили что-то под названием label
, а в button_pressed_handler
оно превратилось в self.label
. Как бы то ни было, исходная label
является локальной переменной, а не переменной экземпляра. Измените label
в do_layout
на self.label
и измените там запись размера на self.label
.
Да, это сделало трюк, Рольф! опубликуйте это как ответ, чтобы я мог указать вам, если хотите.
Как написано в моем комментарии:
в do_layout вы определили что-то под названием label, а в button_pressed_handler оно превратилось в self.label. Как бы то ни было, исходная метка является локальной переменной, а не переменной экземпляра.
Измените метку в do_layout на self.label и измените там запись сайзера на 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()
Пожалуйста, включите полную ошибку трассировки.