wxFormBuilder с Python: доступ к FlexGridSizer из подкласса

Я строю графический интерфейс в wxFormBuilder и пишу код для него на Python.

Я заметил, что все созданные мной виджеты назначены self в сгенерированном коде. Например, графический интерфейс с одним фрагментом текста может выглядеть так:

class MyFrame(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self,parent)
        self.myStaticText = wx.StaticText(self,wx.ID_ANY,'My Text',0)

Итак, объект myStaticText становится атрибутом MyFrame учебный класс. Это хорошо, потому что я могу написать новый класс, который наследует этот класс, а затем выполнять другие функции, такие как обновление myStaticText объект:

import MyFrmae
class GUI(MyFrame):
    def __init_(self,parent):
        MyFrame.__init__(self,parent)

    def updateText(self):
        self.staticText.SetLabel('My Other Text')

Проблема в том, что wxFormBuilder не добавляет self перед любыми объектами FlexGridSizer. Итак, сгенерированный код выглядит так:

myFlexGridSizer = wx.FlexGridSizer(3,1,0,0)

вместо:

self.myFlexGridSizer = wx.FlexGridSizer(3,1,0,0)

В результате я не могу получить доступ к этому объекту из любого другого класса, что мне действительно нужно сделать.

Так...

  1. Есть ли способ получить доступ к объекту из другого класса, если у него нет self перед ним, даже если я унаследую это напрямую?
  2. Есть ли способ изменить настройку в wxFormBuilder, чтобы он добавлял self?

2 ответа

Если я хорошо понимаю, вы хотите получить доступ к FlexGridSizer что сгенерировал конструктор форм?

Я никогда не использовал wxFormBuilder но я думаю, что идея в том, что это создает wxFlexGridSizer, манипулировать им, чтобы сделать макет формы, и вызывает SetSizer на ваше wxWindow (или же wxFrame в вашем случае) и забудьте об этом, потому что расположение больше не изменится.

Один простой вариант (но не самый лучший) - позвонить GetSizer на вашем кадре, и вы можете получить доступ к wxSizer оттуда.

Другой вариант - иметь определенный sizer член в вашем MyFrame, где вы будете хранить wxFlexGridSizer, но это, вероятно, будет связано с изменением кода, сгенерированного wxFormBuilder

Я попробовал просто вызвать сайзерself.my_sizerв wxFormBuilder 3.10.1, и сгенерированный код Python в порядке. Я обращаюсь к сайзеру, как и к любому другому члену сгенерированного класса.

Другие вопросы по тегам