如何使wxpython网格自动适应窗口
我想要一个简单的方法,让我的窗口里的wx.grid.Grid对象能够自动适应窗口大小。
现在我的这个四列的表格右边有很多空白,看起来很难看。如果所有的列都能根据窗口大小的变化来扩展或收缩,那就好了!
有没有办法让这个功能实现呢?
2 个回答
6
你需要捕捉窗口大小改变的事件,并把它和一个事件处理程序绑定在一起。我在这个例子中展示了怎么做:
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就可以了。
4
使用 wx.EXPAND|wx.ALL
函数来扩展你的网格
myGrid = gridlib.Grid(panel)
sizer.Add(myGrid, 1, wx.EXPAND|wx.ALL)
补充说明 - 根据我的经验,我需要将布局管理器添加到父窗口,并且还要调用 .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