【问题标题】:wxpython Gridsizer not fitting to panelwxpython Gridsizer 不适合面板
【发布时间】:2012-12-06 04:14:16
【问题描述】:

我正在开发一个 wxpython GUI。我有三个面板(左侧两个水平拆分,右侧一个与另外两个垂直拆分——想想左半边的两个正方形和右半边的高矩形)。我正在尝试在面板 3 中安装 Gridsizer(图像中的 P3)。我似乎无法让网格面板“填充”整个面板 3。相反,它们会捕捉到顶部和底部。理想情况下,我希望 10 个小面板(2 行,5 列)调整大小并很好地填充面板 3(大小相同且大到足以看到每个面板)。我究竟做错了什么?谢谢!

**** 编辑 **** 我已将代码更改为如下所示:

        sizer_31 = wx.BoxSizer(wx.VERTICAL)
        gs = wx.GridSizer(0,4,7,7)

        for i in self.Panel_Others.keys():
            gs.Add(self.Panel_Others[i],0,wx.ALIGN_CENTER|wx.ALL,5)

        sizer_31.Add(gs,0,wx.ALIGN_CENTER|wx.ALL,5)
        self.OtherTeams.SetSizer(sizer_31)
        sizer_31.SetSizeHints(self.OtherTeams)

我的新面板 3 如下图所示。这是一些改进。但是,我希望各个面板(总共 10 个)扩展相同的数量,以便整个笔记本页面被相同大小的较小面板覆盖(想象一下日历的样子,每天都是一个面板)。

**** 结束编辑 ****

以下是我的原始代码:

注意:self.OtherTeamsself.Panel3 下的 wx.Notebook 页面。 self.Panel_Others 是包含我正在显示的 wx.Panels 的字典(这会动态变化,所以这就是为什么我有它们的字典而不是指定它们的原因)。

        sizer_31 = wx.BoxSizer(wx.HORIZONTAL)
        gs = wx.GridSizer(2,5,5,5)

        for i in self.Panel_Others.keys():
            sizer_temp = wx.BoxSizer(wx.VERTICAL)
            sizer_temp.Add(self.Panel_Others[i],1,wx.EXPAND)
            gs.Add(sizer_temp,1,wx.EXPAND,0)

        sizer_31.Add(gs,0,wx.EXPAND)
        self.OtherTeams.SetSizer(sizer_31)

【问题讨论】:

    标签: python grid wxpython panel sizer


    【解决方案1】:

    wxPython 2.8 中,这将导致页面左上角出现单一模糊。 wxPython 2.9 在使用 sizers 时更聪明一些,这就是为什么它似乎有点工作。

    首先,您在BoxSizer 中创建一个GridSizer,但不允许它动态扩展(wx.EXPAND)。 其次,您将 sizer 设置为 wx.Notebook 而不是页面(面板),这会将整个布局向下移动并裁剪网格 sizer 中控件/面板的底行,或者将在 @987654327 中完全忽略@ 从而将所有内容移动到左上角。

    这应该可以解决问题:

    sizer_31 = wx.BoxSizer(wx.VERTICAL) # page (panel) sizer for outer border
    gs = wx.GridSizer(0,4,7,7) # content sizer
    
    for i in self.Panel_Others.keys():
        gs.Add(self.Panel_Others[i],0,wx.EXPAND|wx.ALL,5) 
        # + wx.EXPAND: allow the content to fill the 'cells'
        #              (proportion is ignored here so it can be 0)
    sizer_31.Add(gs,1,wx.EXPAND|wx.ALL,5) 
    # + 1, wx.EXPAND: allow the grid to expand to the main sizer
    #                 which in turn fits to the page
    self.Panel3.SetSizer(sizer_31) # set the sizer to page, not the notebook
    

    编辑:以下示例演示如何在 wx.Notebook 页面中动态更新 wx.GridSizer 的内容:

    import wx
    
    class MyFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, title='wx.Notebook')
            # create a wx.Notebook
            book = wx.Notebook(self)
            # create a new page; wx.Notebook owns the page
            # therefore the notebook must be the parent window
            page = MyPage(parent=book)
            # add the page to the notebook:
            book.AddPage(page, 'Page 1')
            book.AddPage(MyPage(book),'Page 2')
            book.AddPage(MyPage(book),'Page 3')
    
    class MyPage(wx.Panel):
        "a page for wx.Notebook"
        def __init__(self, parent):
            # NOTE: wxPython 2.9.4/winXP may create graphic 
            # artifacts when more than one page is added. This can
            # be avoided by creating the page with a size of (0,0).
            # the reason for this is: the page (here a panel) is
            # created with the default size and position (upper
            # left corner). Once the layout is applied, the page
            # is moved to the proper coordinates. However, the
            # wx.Notebook is not redrawn so it will leave a black
            # spot where the page was moved away from. Alternatively,
            # the frame or notebook can be Refresh()ed after the
            # frame is shown.
            wx.Panel.__init__(self, parent, size=(0,0))
            # create sizer to add a border
            pageSizer = wx.BoxSizer(wx.VERTICAL)
            # create a grid sizer for the content
            self.grid = wx.GridSizer(0, 4, 5, 5)
            # add the grid sizer to the page sizer:
            # to allow the grid to fill the entire page,
            # set proportion>0 and add the wx.EXPAND flag.
            # the border of 10 is the spacing between the
            # page and the cells of the grid
            pageSizer.Add(self.grid, 1, wx.EXPAND|wx.ALL, 10)
            # set the main sizer:
            self.SetSizer(pageSizer)
            # add content to the grid
            self.GenerateContent()
            # DEMO: click any white space on the page to 
            # generate new content
            self.Bind(wx.EVT_LEFT_DOWN, self.GenerateContent)
    
        def GenerateContent(self, event=None):
            "dynamically create page content"
            # remove all items from the grid and destroy them
            # NOTE: if you don't actually create new controls here,
            # but use a list of controls created elsewhere (like in
            # in your code), do not delete the items! Use:
            # deleteWindows=False instead.
            self.grid.Clear(deleteWindows=True)
            # generate new grid content
            for i in range(10):
                # the contents are owned by the page,
                # therefore the page must be the parent window:
                # NOTE: size=(0,0) here is not required but
                # eliminates a briefly shown graphic artifact
                cell = wx.Panel(self, size=(0,0))
                cell.SetBackgroundColour(self.NewColor())
                # add the content (cells) to the grid:
                # specify the wx.EXPAND flag to fit the
                # content to the grid cell
                self.grid.Add(cell, flag=wx.EXPAND)
            # DEMO: hint text
            self.grid.Add(wx.StaticText(self, label=
                'Click empty cell to update content ->'),
                          flag=wx.EXPAND)
            # recalculate the layout to move the new contents
            # of the grid sizer into place
            self.Layout()
    
        col = 0 # DEMO: coloring
        def NewColor(self):
            self.col = (self.col + 3) % 241
            return wx.Colour(0, self.col * 10 % 255, self.col % 255)
    
    app = wx.App(False)
    MyFrame().Show()
    app.MainLoop()
    

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 1970-01-01
      • 2014-12-05
      • 2011-06-17
      • 2014-01-22
      • 1970-01-01
      • 2011-10-31
      • 2018-03-12
      • 1970-01-01
      相关资源
      最近更新 更多