Используйте переменную класса в другом классе - PullRequest
2 голосов
/ 31 января 2011

Приветствую всех,

В настоящее время я работаю над приложением, использующим Python и wxPython.В нем у меня есть диалог, где несколько полей заполнены, чтобы вставить «документ» в базу данных.Макет этого диалога состоит в основном из wx.Notebook с несколькими «вкладками», каждая из которых содержит своего рода поля.

# Dialog class
class NovoRegisto(wx.Dialog):
    def __init__(self,parent):
        wx.Dialog.__init__(self, parent, title='Registar Nova O.T.', size=(900,600))

        painel = wx.ScrolledWindow(self, -1, style=wx.VSCROLL|wx.HSCROLL)
        painel.SetScrollbars(0,30,0,500)
        notebook = wx.Notebook(painel)

        # create the page windows as children of the notebook
        pag1 = InfoOT(notebook)
        pag2 = Avaliacao(notebook)
        pag3 = Componentes(notebook)
        pag4 = Material(notebook)
        pag5 = OTsRelacionadas(notebook)

                          <...>
        # function to insert data in SQLite database
        def OnRegister(self,event):
                          <...>

# first tab class
class InfoOT(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

                          <...>

Как видите, у меня есть класс для самого диалога (сопределение, управляемое кнопкой «Зарегистрироваться»), а затем отдельный класс для каждой из «вкладок» записной книжки.

Теперь, чтобы отправить данные в базу данных, я должен иметь доступ кПеременные "tabs" в определении "OnRegister" (который принадлежит классу Dialog).Тем не менее, я до сих пор не нашел способ сделать это.

Кто-нибудь может мне помочь?Должен ли я изменить структуру моей программы?Я сделал это так, потому что это был единственный способ заставить ноутбук работать ...

Заранее спасибо

1 Ответ

3 голосов
/ 31 января 2011

Ваши "вкладки" не являются переменными класса, они являются локальными переменными внутри функции __init__.Также вам не нужны переменные класса, вам нужны переменные экземпляра.Для чтения и записи переменных экземпляра вам необходимо обращаться к ним как к атрибутам self, например self1.pag1, а не записывать их имена.

Необходимо различать:

  • локальные переменные функции - переменные, которые вы назначаете в функции
  • переменные класса - атрибуты класса, к которым вы обращаетесь через оператор атрибута (например, NovoRegisto.variable_name)
  • переменные экземпляра - атрибуты экземпляра, которые выдоступ с помощью оператора атрибута в self (например, self.pag1).

Возможно, вам следует прочитать больше о том, как классы Python должны использоваться.

В качестве дополнительной заметки вы чаще всего захотите использовать

super(InfoOT, self).__init__(parent)

over

wx.Panel.__init__(self, parent)

, который доступен в классах нового стиля (т.е. во всех классах, которые косвенно или прямонаследовать от встроенного object)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...