2013-08-15 2 views
1

У меня есть графический интерфейс Python с фреймом, который имеет одну верхнюю панель и вертикальный splitterwindow. Для каждой панели в splitterwindow я создал два класса Panel, один со списком, а другой с сеткой. У каждого класса есть несколько кнопок.Python, Как вызвать метод экземпляра изнутри другого класса

Есть ли способ держать кнопку подключения event.bind и код функции внутри класса и заставить его работать, потому что, в настоящее время я получаю следующее сообщение об ошибке:

AttributeError: 'Panel' object has no attribute 'm_dirPicker1' 

Я хотел бы знать, какие является наилучшей практикой в ​​сложившейся ситуации.

Это пример небольшой пример того, что я написал:

class Frame (wx.Frame): 
    ... 
    self.m_datapanel = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL) 
    self.m_filespanel = Source_Panel(self.m_splitter1) 
    self.m_gridpanel = Data_Viewer(self.m_splitter1) 

class Source_Panel (wx.Panel): 
    ... 

     # Connect Events 
     self.m_listBox.Bind(wx.EVT_LISTBOX_DCLICK, self.m_listBoxOnListBoxDClick) 
     self.m_clearbutton.Bind(wx.EVT_BUTTON, self.m_clearbuttonOnButtonClick) 
     self.m_importbutton.Bind(wx.EVT_BUTTON, self.m_importbuttonOnButtonClick) 
     self.m_showdata.Bind(wx.EVT_BUTTON, self.m_showdataOnButtonClick) 

    def __del__(self): 
     pass 

    # Virtual event handlers, overide them in your derived class 
    def m_listBoxOnListBoxDClick(self, event): 
     event.Skip() 

    def m_clearbuttonOnButtonClick(self, event): 
     event.Skip() 

    def m_importbuttonOnButtonClick(self, event): 
     src_directory = frame.m_datapanel.m_dirPicker1.GetTextCtrlValue() 

    def m_showdataOnButtonClick(self, event): 
     event.Skip() 


class Data_Viewer (wx.Panel): 
    ... 

ответ

1

Я буду считать, что ваш Source_Panel экземпляр будет ребенок из MyFrame экземпляра (я буду называть ваш Frame как MyFrame, чтобы избежать путаницы с базовым классом wx.Frame).

В этом случае атрибут Parent вашего экземпляра Source_Panel должен ссылаться на родителя MyFrame.

Тогда вы можете просто позвонить:

self.Parent.m_datapanel.m_dirPicker1.GetTextCtrlValue() 
+0

Вы правы. Спасибо за помощь. Я смотрел другую тему, когда я читал что-то полезное. Я также могу использовать: self.m_frame = Frame (None), а затем src_directory = self.m_frame.m_dirPicker1.GetTextCtrlValue(). Я вижу, что это точно то же, что вы написали ... С уважением. Иво – TMoover

+0

отлично, просто обратите внимание, что поскольку вы подклассифицируете 'wx.Panel', атрибут' self.Parent' должен уже существовать после создания экземпляра 'Source_Panel' - вам не нужно назначать новый атрибут' self.m_frame'. –

+0

Спасибо, что указал на это. С уважением. Ivo – TMoover

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