如何在wxPython中创建包含两个水平分割面板的notebook

59 阅读2分钟

我们希望在wxPython中创建一个包含两个水平分割面板的notebook。这两个面板中,顶部面板同样水平分割为两个子面板,每个子面板中都显示一个wx.grid对象。然而,按照下面的代码,我们发现顶部面板中的两个网格并没有显示出来:

class NoteBook(wx.Notebook):

    def __init__(self, parent, pages):

        wx.Notebook.__init__(self, parent, id=wx.ID_ANY, style= wx.BK_DEFAULT)
        self.parent = parent
        page = "TEST"

        self.splitter_window = wx.SplitterWindow(self)

        self.AddPage(self.splitter_window, page)
        title_name = page[1:]

        grid_panel = wx.Panel(self.splitter_window, style=wx.BORDER_THEME)
        grid_splitter = wx.SplitterWindow(grid_panel)

        grid_panel_1 = wx.Panel(grid_splitter, style=wx.BORDER_THEME)
        grid1 = grid_maker.GridArea(grid_panel_1)
        grid1.CreateGrid(page) #create the grid 1
        grid1.addToGrid(page) #adding some data to grid 1
        binder = cxt_functions.GridFunctions(self, grid1) #bind some functions to grid1
        binder.BindCrewGridMenu()            

        grid_panel_2 = wx.Panel(grid_splitter, style=wx.BORDER_THEME)
        grid2 = grid_maker.CreateGrid(grid_panel_2) #create the grid 1
        grid2.addToGrid(page) #adding some data to grid 1


        grid_splitter.SplitVertically(grid_panel_1, grid_panel_2, 100)

        grid_sizer = wx.BoxSizer(wx.VERTICAL)
        grid_sizer.Add(grid1, 1, wx.EXPAND | wx.ALL, 7)
        grid_sizer.Add(grid2, 0, wx.EXPAND | wx.ALL, 7)

        grid_panel.SetSizer(grid_sizer)

        chart_panel = wx.Panel(self.splitter_window, style=wx.BORDER_THEME)
        line_chart = bar_line.CanvasPanel(chart_panel, title_name)
        line_chart.draw()


        self.splitter_window.SplitHorizontally(grid_panel, chart_panel, 500)

        p_sizer = wx.BoxSizer(wx.VERTICAL)
        p_sizer.Add(self, 1, wx.EXPAND | wx.ALL, 7)    
        self.parent.SetSizer(p_sizer)


        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.parent, 1, wx.EXPAND)
        self.SetSizer(sizer)

2、解决方案

上面的代码中存在一些问题,可能导致顶部面板中的两个网格没有显示出来。为了解决这个问题,我们可以参考以下解决方案:

  • 导入必要的模块,包括wx、wx.grid和wx.SplitterWindow:
import wx
import wx.grid as gridlib
from wx.lib.splitter import MultiSplitterWindow
  • 创建一个MainFrame类,它是我们应用程序的主窗口:
class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="Nested Splitters", size=(800,600))
        panel = MainPanel(self)
        self.Show()
  • 在MainFrame类中,创建一个MainPanel类,它是我们应用程序的主面板,其中包含notebook:
class MainPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        notebook = wx.Notebook(self)

        page = MultiSplitterWindow(notebook, style=wx.SP_LIVE_UPDATE)
        notebook.AddPage(page, "Splitter")

        hSplitter = wx.SplitterWindow(page)
        panelOne = GridPanel(hSplitter)
        panelTwo = GridPanel(hSplitter)
        hSplitter.SplitVertically(panelOne, panelTwo)
        hSplitter.SetSashGravity(0.5)

        panelThree = RegularPanel(page)
        page.SplitHorizontally(hSplitter, panelThree)
        page.SetSashGravity(0.5)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(notebook, 1, wx.EXPAND)
        self.SetSizer(sizer)
  • 在MainPanel类中,我们创建了一个MultiSplitterWindow对象作为notebook的第一个页面,然后在MultiSplitterWindow中创建了一个水平分割窗口hSplitter。我们将两个GridPanel对象添加到hSplitter中,并使用SplitVertically方法将它们垂直分割。

  • 在MainPanel类中,我们还创建了GridPanel类,它包含一个wx.grid对象。

  • 在MainPanel类中,我们还创建了RegularPanel类,它是一个简单的面板,我们将其添加到页面的底部。

  • 在应用程序的最后,我们创建一个MainFrame类的实例并调用它的Show方法来显示主窗口。

通过这些改进,我们就可以创建一个包含两个水平分割面板的notebook,并且顶部面板中的两个网格也将正常显示。