【问题标题】:Confused on how to structure the GUI (wxpython)对如何构建 GUI 感到困惑(wxpython)
【发布时间】:2011-09-02 06:21:23
【问题描述】:

我从一本书转到另一本书,从谷歌搜索转到另一本书,我注意到每一本书都以完全不同的方式启动主窗口。

我不想养成坏习惯,所以请有人给我最好的这些选择,以及为什么它是更好的方法。以下是我见过的所有方法

A)
类 iFrame(wx.Frame): def init(....): wx.Frame._init_(...)

B)
类 iFrame(wx.Frame): def 初始化(...): super_init_(...)

C)
然后我看到一些使用面板的方法,例如
class iPanel(wx.Panel) def 初始化(...): wx.Panel.init(...)

D)
更令人困惑的是有些使用 wx
class iApp(wx.App) 的常规 App 类: def OnInit(self): wx.Frame.init(...)

如果我的某些结构有误,请原谅我,但我在脑海中回忆起这些,再次提问......其中哪一个,如果有的话,是构建 GUI 的最佳方式。当它们都以不同的方式做事时,很难遵循教程和书籍

编辑:如果格式不正确,很抱歉,但通常它可以工作......

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    别担心。你不会因为现在做出错误的选择而毁掉你未来的编程。

    你提到的选项都没有错。他们都做不同的事情,因为不同的应用程序有不同的要求。没有一种方法是最好的。

    只做你想做的事,做适合你的事,一旦你更加熟悉,你就会明白为什么不同的代码会有不同的表现。

    【讨论】:

      【解决方案2】:

      我最喜欢开始 wx 应用程序开发的方式是:

      import wx
      
      class MainWindow(wx.Frame):
          def __init__(self, *args, **kwargs):
              wx.Frame.__init__(self, *args, **kwargs)
      
              self.panel = wx.Panel(self)
              self.button = wx.Button(self.panel, label="Test")
      
              self.sizer = wx.BoxSizer()
              self.sizer.Add(self.button)
      
              self.panel.SetSizerAndFit(self.sizer)  
              self.Show()
      
      app = wx.App(False)
      win = MainWindow(None)
      app.MainLoop()
      

      另见question,这是相关的。

      【讨论】:

        【解决方案3】:

        我学到了一个艰难的方法,就像在每个应用程序中一样,封装很重要。 wxPython 特有的,主框架对象应该只有一个面板小部件,以及可选的菜单栏、工具栏和状态栏小部件。没有别的了。

        这是我的新 wxPython 应用程序的基本模式:

        (2019 年 2 月 7 日更新:Wx Phoenix 和 Python 3)

        import wx
        
        
        class MainFrame(wx.Frame):
            """Create MainFrame class."""
            def __init__(self, *args, **kwargs):
                super(MainFrame, self).__init__(None, *args, **kwargs)
                self.Title = 'Basic wxPython module'
                self.SetMenuBar(MenuBar(self))
                self.ToolBar = MainToolbar(self)
                self.status_bar = StatusBar(self).status_bar
                self.Bind(wx.EVT_CLOSE, self.on_quit_click)
                panel = MainPanel(self)
                sizer = wx.BoxSizer()
                sizer.Add(panel)
                self.SetSizerAndFit(sizer)
                self.Centre()
                self.Show()
        
            def on_quit_click(self, event):
                """Handle close event."""
                del event
                wx.CallAfter(self.Destroy)
        
        
        class MainPanel(wx.Panel):
            """Panel class to contain frame widgets."""
            def __init__(self, parent, *args, **kwargs):
                super(MainPanel, self).__init__(parent, *args, **kwargs)
        
                """Create and populate main sizer."""
                sizer = wx.BoxSizer(wx.VERTICAL)
                cmd_quit = wx.Button(self, id=wx.ID_EXIT)
                cmd_quit.Bind(wx.EVT_BUTTON, parent.on_quit_click)
                sizer.Add(cmd_quit)
                self.SetSizer(sizer)
        
        
        class MenuBar(wx.MenuBar):
            """Create the menu bar."""
            def __init__(self, parent, *args, **kwargs):
                super(MenuBar, self).__init__(*args, **kwargs)
                # File menu
                file_menu = wx.Menu()
                self.Append(file_menu, '&File')
        
                quit_menu_item = wx.MenuItem(file_menu, wx.ID_EXIT)
                parent.Bind(wx.EVT_MENU, parent.on_quit_click, id=wx.ID_EXIT)
        
                file_menu.Append(quit_menu_item)
        
        
        class MainToolbar(wx.ToolBar):
            """Create tool bar."""
            def __init__(self, parent, *args, **kwargs):
                super(MainToolbar, self).__init__(parent, *args, **kwargs)
        
                #quit_bmp =  wx.ArtProvider.GetBitmap(wx.ART_QUIT)
                #self.AddTool(wx.ID_EXIT, 'Quit', wx.Bitmap(quit_bmp))
                #self.SetToolShortHelp(wx.ID_EXIT, 'Quit')
                #self.Bind(wx.EVT_TOOL, parent.on_quit_click, id=wx.ID_EXIT)
                #self.Realize()
        
        
        class StatusBar(object):
            def __init__(self, parent):
                """Create status bar."""
                self.status_bar = parent.CreateStatusBar()
        
        
        if __name__ == '__main__':
            """Run the application."""
            screen_app = wx.App()
            main_frame = MainFrame()
            screen_app.MainLoop()
        

        【讨论】:

        • 这是我一直在寻找的东西。非常感谢。
        • 除了你如何将它组织成文件?
        • @XilyummY 这取决于。对于一个小型应用程序,所有内容都在一个文件中。对于一个大的,一个框架,另一个面板,第三个菜单和工具栏(也许)。你的选择。 (这是你想要的吗?)
        • 这部分是我想要的。除了,您将如何导入大型应用程序的菜单和工具栏?我试过了,但没有用。
        • @XilyummY 我添加了一个新的答案,主要类在单独的文件中定义
        【解决方案4】:

        针对 XilyummY 的评论,我添加了这个附加答案,以展示如何将主要类组织在单独的文件中。

        这是我基于四个文件的解决方案:

        1. main.py:应用程序和应用程序加载器的主框架;
        2. main_panel.py:应用程序的主面板;
        3. menu_bar.py:框架的菜单栏定义;
        4. tool_bar.py:框架中的工具栏。

        代码如下:

        main.py

        import wx
        
        from main_panel import MainPanel
        from menu_bar import MenuBar
        from tool_bar import MainToolbar
        
        
        class MainFrame(wx.Frame):
            """Create MainFrame class."""
            def __init__(self, *args, **kwargs):
                super(MainFrame, self).__init__(None, *args, **kwargs)
                self.Title = 'Basic wxPython module'
                self.SetMenuBar(MenuBar(self))
                self.ToolBar = MainToolbar(self)
                self.status_bar = StatusBar(self).status_bar
                self.Bind(wx.EVT_CLOSE, self.on_quit_click)
                panel = MainPanel(self)
                sizer = wx.BoxSizer()
                sizer.Add(panel)
                self.SetSizerAndFit(sizer)
                self.Centre()
                self.Show()
        
            def on_quit_click(self, event):
                """Handle close event."""
                del event
                wx.CallAfter(self.Destroy)
        
        
        class StatusBar(object):
            def __init__(self, parent):
                """Create status bar."""
                self.status_bar = parent.CreateStatusBar()
        
        
        if __name__ == '__main__':
            """Run the application."""
            screen_app = wx.App()
            main_frame = MainFrame()
            screen_app.MainLoop()
        

        main_panel.py

        import wx
        
        
        class MainPanel(wx.Panel):
            """Panel class to contain frame widgets."""
            def __init__(self, parent, *args, **kwargs):
                super(MainPanel, self).__init__(parent, *args, **kwargs)
        
                """Create and populate main sizer."""
                sizer = wx.BoxSizer(wx.VERTICAL)
                cmd_quit = wx.Button(self, id=wx.ID_EXIT)
                cmd_quit.Bind(wx.EVT_BUTTON, parent.on_quit_click)
                sizer.Add(cmd_quit)
                self.SetSizer(sizer)
        

        menu_bar.py

        import wx
        
        
        class MenuBar(wx.MenuBar):
            """Create the menu bar."""
            def __init__(self, parent, *args, **kwargs):
                super(MenuBar, self).__init__(*args, **kwargs)
                # File menu
                file_menu = wx.Menu()
                self.Append(file_menu, '&File')
        
                quit_menu_item = wx.MenuItem(file_menu, wx.ID_EXIT)
                parent.Bind(wx.EVT_MENU, parent.on_quit_click, id=wx.ID_EXIT)
        
                file_menu.Append(quit_menu_item)
        

        tool_bar.py

        import wx
        
        
        class MainToolbar(wx.ToolBar):
            """Create tool bar."""
            def __init__(self, parent, *args, **kwargs):
                super(MainToolbar, self).__init__(parent, *args, **kwargs)
        
                new_bmp =  wx.ArtProvider.GetBitmap(wx.ART_NEW)
                #preferences_bmp = wx.Bitmap('images/preferences.png')
                quit_bmp =  wx.ArtProvider.GetBitmap(wx.ART_QUIT)
        
                self.AddTool(wx.ID_NEW, 'New', new_bmp)
                #self.AddTool(wx.ID_PREFERENCES, 'Preferences', preferences_bmp)
                self.AddTool(wx.ID_EXIT, 'Quit', quit_bmp)
        
                self.SetToolShortHelp(wx.ID_NEW, 'New ...')
                self.SetToolShortHelp(wx.ID_PREFERENCES, 'Preferences ...')
                self.SetToolShortHelp(wx.ID_EXIT, 'Quit')
        
                self.Bind(wx.EVT_TOOL, parent.on_quit_click, id=wx.ID_EXIT)
        
                self.Realize()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多