2011-12-22 10 views
0

1つのフレームにあるパネルで、別のフレームの別のパネルにある入力変数を参照する方法はありますか?wxpython - 別のフレームから入力変数を返す

私は基本的に、wxpython GUIのメニューバーに[オプション]タブを作成して、クリックすると新しい変数を変更できるようにする新しいフレームを開きます。しかし、後でこれらの変数を参照しようとすると、 AttributeError:型オブジェクト 'OptionsPanel'に 'Input1'属性がありません。

私はパネルとクラスの両方をクラスとして定義しています。事前に

import wx 
class MainFrame(wx.Frame): 
    def __init__(self,title): 
     wx.Frame.__init__(self, None, title=title, pos=(150,150), size=(200,300)) 
     menuBar = wx.MenuBar() 
     menu = wx.Menu() 
     m_options = menu.Append(wx.ID_EDIT, "&Options", "Options") 
     self.Bind(wx.EVT_MENU, self.OnOptions, m_options) 
     menuBar.Append(menu, "&Options") 
     self.SetMenuBar(menuBar) 
     panel=MainPanel(self) 
    def OnOptions(self, event): 
     frame = OptionsFrame("Options Frame") 
     frame.Show() 
class OptionsFrame(wx.Frame): 
    def __init__(self,title): 
     wx.Frame.__init__(self, None, title=title, pos=(150,150), size=(200,200))  
     panel=OptionsPanel(self) 
class OptionsPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     self.label = wx.StaticText(self, label="Input Value", pos=(40,60)) 
     self.Input1 = wx.TextCtrl(self, value="1.0", pos=(80,80), size=(60,-1)) 
class MainPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     self.button =wx.Button(self, label="GO", pos=(60,100)) 
     self.Bind(wx.EVT_BUTTON, self.OnClick,self.button) 
    def OnClick(self,event): 
     MyVariable= OptionsPanel.Input1.GetValue() #This won't work! 
     print dt0 
if __name__=="__main__": 
    app = wx.App(redirect=False) 
    frame = MainFrame("Multiple Frames Attempt") 
    frame.Show() 
    app.MainLoop() 

ありがとう: はここに私の完全なコードです!

答えて

1

問題の1つは、OptionsFrameクラスのクラスOptionsPanel( 'panel')のインスタンス化を参照する代わりに、クラスMainPanelのOnClickメソッドがクラスOptionsPanelを参照していることです。

import wx 
class MainFrame(wx.Frame): 
    def __init__(self,title): 
     wx.Frame.__init__(self, None, title=title, pos=(150,150), size=(200,300)) 
     menuBar = wx.MenuBar() 
     menu = wx.Menu() 
     m_options = menu.Append(wx.ID_EDIT, "&Options", "Options") 
     self.Bind(wx.EVT_MENU, self.OnOptions, m_options) 
     menuBar.Append(menu, "&Options") 
     self.SetMenuBar(menuBar) 
     panel=MainPanel(self) 
     self.options_frame = None 
    def OnOptions(self, event): 
     self.options_frame = OptionsFrame("Options Frame") 
     self.options_frame.Show() 
    def GetInput1Value(self): 
     if self.options_frame is not None: 
      return(self.options_frame.options_panel.Input1.GetValue()) 
     else: 
      return('None') 
class OptionsFrame(wx.Frame): 
    def __init__(self,title): 
     wx.Frame.__init__(self, None, title=title, pos=(150,150), size=(200,200))  
     self.options_panel=OptionsPanel(self) 
class OptionsPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     self.label = wx.StaticText(self, label="Input Value", pos=(40,60)) 
     self.Input1 = wx.TextCtrl(self, value="1.0", pos=(80,80), size=(60,-1)) 
class MainPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 
     self.parent_frame = parent 
     self.button =wx.Button(self, label="GO", pos=(60,100)) 
     self.Bind(wx.EVT_BUTTON, self.OnClick,self.button) 
    def OnClick(self,event): 
     MyVariable= self.parent_frame.GetInput1Value() 
     print MyVariable 
if __name__=="__main__": 
    app = wx.App(redirect=False) 
    frame = MainFrame("Multiple Frames Attempt") 
    frame.Show() 
    app.MainLoop() 
+0

Davidありがとうございました。これを修正するには、コードにどのような変更が必要かをお勧めしますか? – Mike

+0

これは非常にpythonicではありませんが、私の編集された答えを確認してください。 –

+0

これらのコードの変更は意味がありますか? MainPanelクラスのOnClickがInput1 TextCtrlにアクセスできるようになりましたか? –

関連する問題