如何在一个框架中的一个面板中引用另一个框架中另一个面板中的输入变量?
我基本上想在我的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()
提前致谢!
答案 0 :(得分:1)
一个问题是类MainPanel中的OnClick方法引用类OptionsPanel,而不是引用类OptionsFrame中类OptionsPanel('panel')的实例化。
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()