【问题标题】:how to make wxpython grid automatic fit-to-window如何使 wxpython 网格自动适应窗口
【发布时间】:2014-09-06 13:33:25
【问题描述】:

我正在寻找一种简单的模式来使用我的窗口内的 wx.grid.Grid 对象来获得自动适合窗口的效果。

到目前为止,我的 4 列网格在右侧有很多空白区域,但我觉得这非常难看,如果所有列都根据窗口大小的变化展开或折叠,效果会更好!

有没有办法让它工作?

【问题讨论】:

  • 请提供代码和图像,您如何获得以及您希望如何查看。小示例将解决它吗?

标签: python user-interface datagrid wxpython


【解决方案1】:

您需要捕获窗口大小调整事件并将其绑定到事件处理程序。我在这个例子中展示了它:

import wx.grid

class Frame ( wx.Frame ):

        def __init__( self, parent ):
                wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Test", pos = wx.DefaultPosition, size = wx.Size( 650,480 ), style = wx.DEFAULT_FRAME_STYLE|wx.RESIZE_BORDER|wx.TAB_TRAVERSAL )

                self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
                sizer = wx.BoxSizer( wx.VERTICAL )
                self.panel = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
                self.inner_sizer = wx.BoxSizer( wx.VERTICAL )
                self.grid = wx.grid.Grid( self.panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0 )

                # Grid
                self.grid.CreateGrid( 10, 4 )
                self.grid.EnableEditing( True )
                self.grid.EnableGridLines( True )
                self.grid.EnableDragGridSize( False )
                self.grid.SetMargins( 0, 0 )

                # Columns
                self.grid.EnableDragColMove( False )
                self.grid.EnableDragColSize( True )
                self.grid.SetColLabelSize( 30 )
                self.grid.SetColLabelAlignment( wx.ALIGN_CENTRE, wx.ALIGN_CENTRE )

                # Rows
                self.grid.EnableDragRowSize( True )
                self.grid.SetRowLabelSize( 80 )
                self.grid.SetRowLabelAlignment( wx.ALIGN_CENTRE, wx.ALIGN_CENTRE )

                # Label Appearance

                # Cell Defaults
                self.grid.SetDefaultCellAlignment( wx.ALIGN_LEFT, wx.ALIGN_TOP )
                self.inner_sizer.Add( self.grid, 1, wx.ALL|wx.EXPAND, 5 )


                self.panel.SetSizer( self.inner_sizer )
                self.panel.Layout()
                self.inner_sizer.Fit( self.panel )
                sizer.Add( self.panel, 1, wx.EXPAND |wx.ALL, 0 )

                self.grid.Bind(wx.EVT_SIZE, self.OnSize)

                self.SetSizer( sizer )
                self.Layout()
                self.Centre( wx.BOTH )
                self.Show()

        def OnSize(self, event):
                width, height = self.GetClientSizeTuple()
                for col in range(4):
                        self.grid.SetColSize(col, width/(4 + 1))


if __name__ == "__main__":
        app = wx.App()
        Frame(None)
        app.MainLoop()

如果您有可变数量的列,只需将该变量替换为 OnSize 中的 4。

【讨论】:

    【解决方案2】:

    使用wx.EXPAND|wx.ALL 函数扩展您的网格

    myGrid = gridlib.Grid(panel)
    sizer.Add(myGrid, 1, wx.EXPAND|wx.ALL)
    

    编辑 - 根据我的经验,我必须将 sizer 添加到父窗口,并添加 .Fit,否则在拖动之前它不会调整大小。

    myGrid = gridlib.Grid(mypanel)
    BS = wx.BoxSizer()
    BS.AddWindow(myGrid, 1, flag=wx.EXPAND)
    mypanel.SetSizer(BS)    # this was important in my code
    BS.Fit(mypanel)     # this may only be necessary to force first fit
    

    【讨论】:

    • 根据我的经验,我必须将 sizer 添加到父窗口,并添加 .Fit,否则在拖动之前它不会调整大小。编辑到帖子中以保留格式。
    猜你喜欢
    • 2010-10-06
    • 1970-01-01
    • 2016-05-09
    • 2012-01-18
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多