简体   繁体   English

如何模块化 wxpython 项目的代码

[英]how to modularise code for wxpython project

i am trying to modularise my code.我正在尝试模块化我的代码。 below is the code generated from wxformbuilder..下面是从 wxformbuilder 生成的代码..


class MyFrame ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 776,483 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )

        self.m_menubar1 = wx.MenuBar( 0 )
        self.m_menu1 = wx.Menu()
        self.m_menubar1.Append( self.m_menu1, u"MyMenu" )

        self.m_menu2 = wx.Menu()
        self.m_menubar1.Append( self.m_menu2, u"MyMenu2" )

        self.m_menu3 = wx.Menu()
        self.m_menubar1.Append( self.m_menu3, u"MyMenu3" )

        self.SetMenuBar( self.m_menubar1 )

        bSizer4 = wx.BoxSizer( wx.HORIZONTAL )

        self.splitter_window = wx.SplitterWindow( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.SP_3DBORDER )
        self.splitter_window.Bind( wx.EVT_IDLE, self.splitter_windowOnIdle )

        self.left_window = wx.Panel( self.splitter_window, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        self.right_window = wx.Panel( self.splitter_window, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        bSizer5 = wx.BoxSizer( wx.VERTICAL )

        self.m_notebook2 = wx.Notebook( self.right_window, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0 )
        self.left_panel = wx.Panel( self.m_notebook2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        self.m_notebook2.AddPage( self.left_panel, u"a page", False )
        self.right_panel = wx.Panel( self.m_notebook2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        self.m_notebook2.AddPage( self.right_panel, u"a page", False )

        bSizer5.Add( self.m_notebook2, 1, wx.EXPAND |wx.ALL, 5 )


        self.right_window.SetSizer( bSizer5 )
        self.right_window.Layout()
        bSizer5.Fit( self.right_window )
        self.splitter_window.SplitVertically( self.left_window, self.right_window, 200 )
        bSizer4.Add( self.splitter_window, 1, wx.EXPAND, 5 )


        self.SetSizer( bSizer4 )
        self.Layout()

        self.Centre( wx.BOTH )

    def __del__( self ):
        pass

    def splitter_windowOnIdle( self, event ):
        self.splitter_window.SetSashPosition( 200 )
        self.splitter_window.Unbind( wx.EVT_IDLE ) 

and this is the way am trying to create separate classes for each panels and windows这就是我尝试为每个面板和 windows 创建单独类的方式

import wx
import wx.lib.inspection

class l_window(wx.Panel):
    def __init__( self , parent):
        super().__init__(self, parent)

        left_window = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )

class r_window(wx.Panel):
    def __init__( self , parent):
        super().__init__(self, parent)

        self.right_window = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )

        bSizer5 = wx.BoxSizer( wx.VERTICAL )
        self.m_notebook2 = wx.Notebook( self.right_window, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0 )
        self.left_panel = wx.Panel( self.m_notebook2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        self.m_notebook2.AddPage( self.left_panel, u"a page", False )
        self.right_panel = wx.Panel( self.m_notebook2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        self.m_notebook2.AddPage( self.right_panel, u"a2 page", False )

        bSizer5.Add( self.m_notebook2, 1, wx.EXPAND |wx.ALL, 5 )

class menu_( wx.Menu ):
    def __init__(self, parent):
        
        self.m_menubar1 = wx.MenuBar( 0 )
        self.m_menu1 = wx.Menu()
        self.m_menubar1.Append( self.m_menu1, u"MyMenu" )

        self.m_menu2 = wx.Menu()
        self.m_menubar1.Append( self.m_menu2, u"MyMenu2" )

        self.m_menu3 = wx.Menu()
        self.m_menubar1.Append( self.m_menu3, u"MyMenu3" )

class MyFrame( wx.Frame ):
    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, 
                id = wx.ID_ANY, 
                title = wx.EmptyString, 
                pos = wx.DefaultPosition, 
                size = wx.Size( 900,600 ), 
                style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetMenuBar( menu_ )

        bSizer4 = wx.BoxSizer( wx.HORIZONTAL )

        self.splitter_window = wx.SplitterWindow( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.SP_3D )
        l1 = l_window(self.splitter_window)
        r1 = r_window(self.splitter_window)
        self.splitter_window.SplitVertically(l1, r1, 200)
        bSizer4.Add( self.splitter_window, 1, wx.EXPAND, 5 )
        self.SetSizer( bSizer4 )

app = wx.App()
frame = MyFrame(parent=None)
frame.Show()
wx.lib.inspection.InspectionTool().Show()
app.MainLoop()

this has produced me so many errors on different combinations i tried...这在我尝试的不同组合上产生了很多错误......

goal here is to factor code of gui segments, in its own different classes(that can be put in different files altogether) for long term manageability.这里的目标是将 gui 段的代码分解为不同的类(可以完全放在不同的文件中),以实现长期可管理性。

Layout is: top Frame has menu bar, also boxsizer that contains splitterwindow, splitterwindow has 2 panes left_window and right_window.布局是:top Frame 有菜单栏,还有包含 splitterwindow 的 boxsizer,splitterwindow 有 2 个窗格 left_window 和 right_window。 right pane consist a notebook with two panels inside.右窗格由一个笔记本组成,里面有两个面板。

any suggestions?有什么建议么?

After using wxPython for just a short time I learned that structure was vital to enable you to code and maintain efficiently.在使用 wxPython 很短的时间后,我了解到结构对于高效编码和维护至关重要。 For small apps a single file with multiple classes will suffice, but as the controls and or panels and dialogs increase then organising the code if separate files becomes indispensible对于小型应用程序,具有多个类的单个文件就足够了,但是随着控件和/或面板和对话框的增加,如果单独的文件变得不可或缺,则组织代码

A similar question has been asked and answered before ( Confused on how to structure the GUI (wxpython) )之前已经提出并回答了一个类似的问题( 对如何构建 GUI(wxpython)感到困惑

In one answer I show how the code can be organised into 4 files, for example例如,在一个答案中,我展示了如何将代码组织成 4 个文件

  1. the main frame for the application and the application loader;应用程序的主框架和应用程序加载器;
  2. main_panel.py: the main panel for the application; main_panel.py:应用程序的主面板;
  3. menu_bar.py: the menu bar definition for the frame; menu_bar.py:框架的菜单栏定义;
  4. tool_bar.py: the tool bar from the frame. tool_bar.py:来自框架的工具栏。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM