wxpython – 一个框架,多个面板,模块化代码
发布时间:2020-12-20 11:33:37 所属栏目:Python 来源:网络整理
导读:我正在开发一个相当大的GUI项目,因此使用wx python来构建它.我有一个框架,多个具有自己功能的框架和一个导入gui组件以及其他外部函数的主文件.我决定保持gui / wxpython代码不同,以便更好地模块化代码. 我的主要问题是如何在单独的面板中执行这些功能以及如
我正在开发一个相当大的GUI项目,因此使用wx
python来构建它.我有一个框架,多个具有自己功能的框架和一个导入gui组件以及其他外部函数的主文件.我决定保持gui / wxpython代码不同,以便更好地模块化代码.
我的主要问题是如何在单独的面板中执行这些功能以及如何使它们从我的主python文件中运行. 下面是我的wxpython代码示例: import wx class MainFrame ( wx.Frame ): def __init__( self,parent ): wx.Frame.__init__ ( self,parent,id = wx.ID_ANY,title = wx.EmptyString,pos = wx.DefaultPosition,size = wx.Size( 800,600 ),style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) self.SetSizeHintsSz( wx.DefaultSize,wx.DefaultSize ) bSizer1 = wx.BoxSizer( wx.VERTICAL ) self.SetSizer( bSizer1 ) self.Layout() self.panelOne = panel_one(self) self.panelTwo = panel_two(self) self.panelTwo.Hide() self.Centre( wx.BOTH ) def __del__( self ): pass class panel_one ( wx.Panel ): def __init__( self,parent ): wx.Panel.__init__ ( self,style = wx.TAB_TRAVERSAL ) bSizer5 = wx.BoxSizer( wx.VERTICAL ) self.m_button2 = wx.Button( self,wx.ID_ANY,u"MyButton",wx.DefaultPosition,wx.DefaultSize,0 ) bSizer5.Add( self.m_button2,wx.ALL,5 ) self.SetSizer( bSizer5 ) self.Layout() # Connect Events self.m_button2.Bind( wx.EVT_BUTTON,self.changeIntroPanel ) def __del__( self ): pass # Virtual event handlers,overide them in your derived class def changeIntroPanel( self,event ): event.Skip() class panel_two ( wx.Panel ): def __init__( self,style = wx.TAB_TRAVERSAL ) ... some code in here ... def __del__( self ): pass 所以那些是我的gui组件.然后,在我的主文件中,我导入它并运行gui: import gui class MainApp(gui.MainFrame): def __init__(self,parent): gui.MainFrame.__init__(self,parent) self.panelOne = Panel1(self) self.panelTwo = Panel2(self) self.panelTwo.Hide() class Panel1(gui.panel_one): def __init__(self,parent): gui.panel_one.__init__(self,parent) def changeIntroPanel( self,event ): if self.panelOne.IsShown(): self.SetTitle("Panel Two Showing") self.PanelOne.Hide() self.PanelTwo.Show() else: self.SetTitle("Panel One Showing") self.PanelOne.Show() self.PanelTwo.Hide() self.Layout() class Panel2(gui.panel_two): def __init__(self,parent): gui.panel_two.__init__(self,parent) def main(): app = wx.App() window = MainApp(None) window.Show(True) app.MainLoop() if __name__ == '__main__': main() 正如你所知,我的想法是我想在我的主文件中完成所有实现.我将如何定义我在第一次在panel_one中定义的changeIntroPanel函数的功能?目前,我们的想法是隐藏panelOne并显示panelTwo. 我之前做过类似的事情,但只有一帧.在这种情况下,它是微不足道的,因为所有函数都在MainFrame类中开始.在这种情况下,我发布的代码将完美地工作. 任何帮助表示赞赏.谢谢. 解决方法
def OnInit(self,parent):用于wx.App,你需要def _ _init_ _(self,parent).
关于__init__请检查:Using inheritance in python 关于__init__和OnInit之间的区别,请查看this link 编辑: gui.py import wx class MainFrame ( wx.Frame ): def __init__( self,style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) self.SetSizeHintsSz( wx.DefaultSize,wx.DefaultSize ) bSizer1 = wx.BoxSizer( wx.VERTICAL ) self.SetSizer( bSizer1 ) self.Layout() # self.panelOne = panel_one(self) # self.panelTwo = panel_two(self) # self.panelTwo.Hide() self.Centre( wx.BOTH ) def __del__( self ): pass class panel_one ( wx.Panel ): def __init__( self,style = wx.TAB_TRAVERSAL ) bSizer5 = wx.BoxSizer( wx.VERTICAL ) self.m_button2 = wx.Button( self,u"panel 1 button",5 ) self.SetSizer( bSizer5 ) self.Layout() # Connect Events self.m_button2.Bind( wx.EVT_BUTTON,self.changeIntroPanel ) def __del__( self ): pass # Virtual event handlers,event ): event.Skip() class panel_two ( wx.Panel ): def __init__( self,u"panel 2 button ",self.changeIntroPanel ) def __del__( self ): pass # Virtual event handlers,event ): event.Skip() mainapp.py import wx import gui class MainApp(gui.MainFrame): def __init__(self,parent) self.parent = parent def changeIntroPanel( self,event ): if self.IsShown(): self.parent.SetTitle("Panel Two Showing") self.Hide() self.parent.panelTwo.Show() class Panel2(gui.panel_two): def __init__(self,event ): if self.IsShown(): self.parent.SetTitle("Panel One Showing") self.parent.panelOne.Show() self.Hide() def main(): app = wx.App() window = MainApp(None) window.Show(True) app.MainLoop() if __name__ == '__main__': main() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |