2011-01-30 3 views
2

Приветствия всем,Использовать переменную класса в другом классе

В настоящее время я работаю над приложением, использующим 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) 

          <...> 

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

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

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

Спасибо заранее

+1

Где 'tabs'? – delnan

+0

@ delnan, я думаю, что «вкладки» просто означает pag1, pag2 ​​и т. Д. – jambox

+0

@ jambox, да, вы правы –

ответ

3

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

Вы должны различать:

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

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

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

super(InfoOT, self).__init__(parent) 

над

wx.Panel.__init__(self, parent) 

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

+1

У него также есть Def OnRegister внутри __init__, который смутил меня от меня ... – jambox

+0

@jambox, I теперь понял, что я ошибся в этом, копируя код на почту. Def OnRegister находится на том же уровне, что и __init__ –

+0

. В чем причина использования супер (..., self)? –

Смежные вопросы