如何处理一个网格的行和列的首部?
在一个wxPython的网格控件中,每行和每列都有它们自己的标签。默认情况下,行的标签是数字,从1开坮。列的标签是字母,从A开始。wxPython提供了一些方法来改变这些标签。图14.3显示了一个带有首部标签的网格。 图14.3
例子14.3显示了产生图14.3的代码。其中网格是用CreateGrid()初始化的。 例14.3 带自定义标签的一个非模式的网格
切换行号显示 1 import wx 2 import wx.grid 3
4 class TestFrame(wx.Frame): 5
6 rowLabels = [\, \, \, \, \] 7 colLabels = [\, \, \, \, \] 8
9 def __init__(self):
10 wx.Frame.__init__(self, None, title=\Headers\,
11 size=(500,200)) 12 grid = wx.grid.Grid(self) 13 grid.CreateGrid(5,5) 14 for row in range(5):
15 #1 start
16 grid.SetRowLabelValue(row, self.rowLabels[row])
17 grid.SetColLabelValue(row, self.colLabels[row]) 18 #1 end
19 for col in range(5):
20 grid.SetCellValue(row, col,
21 \ % (self.rowLabels[row], self.colLabels[col])) 22
23 app = wx.PySimpleApp() 24 frame = TestFrame() 25 frame.Show() 26 app.MainLoop()
正如添加和删除行一样,改变标签也是根据网格的类型而不同的。对于使用CreateGrid()创建的网格,要使用SetColLabelValue(col, value)和
SetRowLabelValue(row, value)方法来设置标签值,如#1所示。参数col和row是列和行的索引,value是要显示在标签中的字符串。要得到一行或一列的标签,使用GetColLabelValue(col)和GetRowLabelValue(row)方法。
对于使用外部网格表的一个网格控件,你可以通过覆盖网格表的GetColLabelValue(col)和GetRowLabelValue(row)方法来达到相同的作用。为了消除混淆,网格控件在当它需要显示标签并且网格有一个关联的表时,内在地调用这些方法。由于返回值是动态地由你在覆盖的方法中所写的代码决定的,所以这里不需要覆盖或调用set*方法。不过set*方法仍然存在——SetColLabelValue(col, value)和
SetRowLabelValue(row, value)——但是你很少会使用到,除非你想让用户能够改变潜在的数据。通常,你不需要set*方法。例14.4显示了如何改变网格表中的标签——这个例子产生与上一例相同的输出。
例14.4 带有自定义标签的使用了网格表的网格
切换行号显示 1 import wx 2 import wx.grid 3
4 class TestTable(wx.grid.PyGridTableBase): 5 def __init__(self):
6 wx.grid.PyGridTableBase.__init__(self) 7 self.rowLabels = [\, \, \, \, \]
8 self.colLabels = [\, \, \, \, \] 9
10 def GetNumberRows(self): 11 return 5 12
13 def GetNumberCols(self): 14 return 5 15
16 def IsEmptyCell(self, row, col): 17 return False 18
19 def GetValue(self, row, col):
20 return \ % (self.rowLabels[row], self.colLabels[col]) 21
22 def SetValue(self, row, col, value): 23 pass 24
25 def GetColLabelValue(self, col):#列标签 26 return self.colLabels[col] 27
28 def GetRowLabelValue(self, row):#行标签 29 return self.rowLabels[row] 30
31 class TestFrame(wx.Frame): 32 def __init__(self):
33 wx.Frame.__init__(self, None, title=\Table\,
34 size=(500,200)) 35 grid = wx.grid.Grid(self) 36 table = TestTable()
37 grid.SetTable(table, True) 38
39 app = wx.PySimpleApp() 40 frame = TestFrame() 41 frame.Show() 42 app.MainLoop()
默认情况下,标签是居中显示的。但是你也可以使用
SetColumnLabelAlignment(horiz, vert)和
SetRowLabelAlignment(horiz, vert)来改变这个行为。其中参数horiz用以控制水平对齐方式,取值有wx.ALIGN_LEFT, wx.ALIGN_CENTRE或wx.ALIGN_RIGHT。参数vert用以控制垂直对齐方式,取值有wx.ALIGN_TOP, wx.ALIGN_CENTRE,或wx.ALIGN_BOTTOM。
行和列的标签区域共享一套颜色和字体属性。你可以使用
SetLabelBackgroundColour(colour) , SetLabelFont(font), and SetLabelTextColour(colour)方法来处理这些属性。参数colour是wx.Colour的一个实例或wxPython会转换为颜色的东西,如颜色的字符串名。参数font是wx.Font的一个实例。与set*相应的get*方法有GetLabelBackgoundColour(), GetLabelFont(),和GetLabelTextFont()。
如何管理网格元素的尺寸?
网格控件提供了几个不同的方法来管理单元格、行和列的尺寸。在这一节,我们将讨论这些方法。图14.4显示了一些用来改变一个特定的单元格的尺寸的方法。 例14.5显示了创建了一个带有可调节大小的单元格、行和列的网格。 图14.4
例14.5 可调整尺寸的单元格的示例代码
切换行号显示 1 import wx 2 import wx.grid 3
4 class TestFrame(wx.Frame): 5 6
7 def __init__(self):
8 wx.Frame.__init__(self, None, title=\Sizes\,
9 size=(600,300))