python表格 下载本文

SetCellRenderer(row, col, renderer)方法,其中renderer参数是用于指定单元

格的新的描绘器。这些方法都简单地设置或得到存储在相关单元格属性对象中的描绘器,所以如果你愿意的话,你可以直接处理GridCellAttr。你可以通过使GetDefaultRenderer和 SetDefaultRenderer(renderer)来得到和设置用于整个网格的默认的描绘器。 你也可以为一行设置描绘器,这个的典型应用是电子表格中的某列总是显示特定类型的数据。实现的方法是SetColFormatBool(col), SetColFormatNumber(col),以及SetColFormatFloat(col, width, precision)。 创建一个自定义的描绘器

要创建你自定义的单元格描绘器,需要创建wx.grid.PyGridCellRenderer的一个子类。创建自定义的单元格描绘器,使你能够以特定的格式显示相关的数据。 图14.6显示了一个自定义描绘器的示例,它随机地绘制单元格的背景色。 图14.6

例14.7是产生图14.6的代码,其中显示了相关的类和所覆盖的方法 例14.7

切换行号显示 1 #-*- encoding:UTF-8 -*- 2 import wx

3 import wx.grid 4 import random 5

6 class

RandomBackgroundRenderer(wx.grid.PyGridCellRenderer):#定义描绘器

7 def __init__(self):

8 wx.grid.PyGridCellRenderer.__init__(self) 9

10

11 def Draw(self, grid, attr, dc, rect, row, col, isSelected):#绘制

12 text = grid.GetCellValue(row, col) 13 hAlign, vAlign = attr.GetAlignment() 14 dc.SetFont( attr.GetFont() ) 15 if isSelected:

16 bg = grid.GetSelectionBackground() 17 fg = grid.GetSelectionForeground() 18 else:

19 bg = random.choice([\, \, \, \, \])

20 fg = attr.GetTextColour() 21

22 dc.SetTextBackground(bg) 23 dc.SetTextForeground(fg)

24 dc.SetBrush(wx.Brush(bg, wx.SOLID)) 25 dc.SetPen(wx.TRANSPARENT_PEN)

26 dc.DrawRectangleRect(rect)

27 grid.DrawTextRectangle(dc, text, rect, hAlign, vAlign) 28 29

30 def GetBestSize(self, grid, attr, dc, row, col): 31 text = grid.GetCellValue(row, col) 32 dc.SetFont(attr.GetFont()) 33 w, h = dc.GetTextExtent(text) 34 return wx.Size(w, h) 35

36 def Clone(self):

37 return RandomBackgroundRenderer() 38

39 class TestFrame(wx.Frame): 40 def __init__(self):

41 wx.Frame.__init__(self, None, title=\Renderer\,

42 size=(640,480)) 43

44 grid = wx.grid.Grid(self) 45 grid.CreateGrid(50,50) 46

47 # Set this custom renderer just for row 4 48 attr = wx.grid.GridCellAttr()

49 attr.SetRenderer(RandomBackgroundRenderer())

50 grid.SetRowAttr(4, attr)#赋于第5行 51

52 for row in range(10):

53 for col in range(10):

54 grid.SetCellValue(row, col,

55 \ % (row, col)) 56

57 app = wx.PySimpleApp() 58 frame = TestFrame() 59 frame.Show() 60 app.MainLoop()

你的描绘器类必须覆盖基类的下面三个方法。

Draw() GetBestSize() Clone() 这三个方法中最重要的是Draw(grid, attr, dc, rect, row, col, isSelected)。其中参数grid是包含相应单元格的网格实例。参数attr是网格的属性实例。如果你需要使用基本的绘制方法的话,参数dc是用于绘制的设备上下文。参数rect是单元格的矩形区域。参数row,col是单元格的坐标,如果单元格当前处于被选状态的话,参数isSelected为True。在你的绘制方法中,你可以自由地做任何你想做的事情。 方法GetBestSize(grid, attr, dc, row, col)返回一个wx.Size实例,该实例代表单元格的首先尺寸。方法Clone()返回一个wx.grid.GridCellRenderer实例。一旦描绘器被定义了,你就可以像使用预定义的描绘器一样使用它。

如何编辑一个单元格?

wxPython的网格控件允许你编辑单元格中的值。敲击一个单元格,或开始键入一个新的数

据值都将打开一个默认的字符串编辑器,让你可以输入不同的字符串。在这一节,我们将讨论多种修改此默认行为的方法。

你可以使用方法EnableEditing(enable)来开关整个网格的可编辑性——参数enable是一个布尔值。如果它是False,那么所有的单元格都不可编辑。如果关闭了网格的可编辑性,那么你就不能再设置单个单元格的编辑状态了。如果打开了网格的可编辑性的话,单个的单元格可以被指定为只读。你可以使用方法IsEditable()来确定网格是否可编辑。 你可以使用方法SetReadOnly(row, col, isReadOnly=True)来设置一个特定单元格的编辑状态。isReadOnly=True代表该单元格为只读,为False代表单元格可编辑。SetReadOnly()是类wx.grid.GridCellAttr中的同名方法的一个简捷方式。换句话说,

你可以使用GetCellAttr(row, col).SetReadOnly(isReadOnly)之类的来将一个单元格设置为只读。使用单元格属性机制的好处就是你可以将SetReadOnly与SetRowAttr()和SetColAttr()方法结合起来,以一次性的将整个行或列设置为可编辑的或只读的。 你也可以使用方法EnableCellEditControl(enable=True)和

DisableCellEditControl()来处理网格的可编辑性,第二个方法等同于EnableCellEditControl(False)。Enable*方法将在当前所选择的单元格中创建并显示该单元格的编辑器。disable*方法则相反。如果enable*方法将工作于当前单元格,那么CanEnableCellControl()返回true,这就意味该网格是可编辑并且单元格没有被指定为只读。如果当前单元格的编辑器被激活了,则方法IsCellEditControlEnabled()返回true。

这里还有一些内在的可用的方法,你可以用于对编辑进行更细致的处理。你可以使用方法

ShowCellEditControl()来触发当前单元格的编辑,并且你也可以使用方法

HideCellEditControl()该编辑。你可以使用方法IsCurrentCellReadOnly()来确定当前单元格可编辑的有效性。你可以使用方法SaveEditControlValue()来确保在编辑器

中所输入的新值被存储。当焦点从被编辑的单元格上移走时,网格控件隐式地调用该方法,当在你的程序中所做的一些事情可能会导致值被丢失时(比如关闭网格所处的窗口时),隐式地调用该方法是一个好的方式。

每个单元格都有它自己特定的编辑器对象。你可以使用方法GetCellEditor(row, col)来得到相关单元格的编辑器的一个引用,返回值是是类wx.grid.GridCellEditor的一个实例。你可以使用方法SetCellEditor(row, col, editor)来设置该编辑器,其中的editor参数是一个wx.grid.GridCellEditor。你可以使用方法

GetDefaultEditor()和SetDefaultEditor(editor)来为整个网格管理默认的编辑器。正如描绘器一样,编辑器对象作为与单元格、行或列相关的wx.grid.GridCellAttr的一部分被存储。

如何使用一个自定义的单元格编辑器?

正如描绘器一样,wxPython提供了几个不同类型的标准编辑器,也让你可以创建你自己的编辑器。 预定义的编辑器

所有的wxPython编辑器都是类wx.grid.GridCellEditor的子类。表14.5说明了这些标准的编辑器。

在接下来的部分,我们将给你展示如何创建自定义的单元格编辑器。 表14.5 wxPyhton中的单元格编辑器

wx.grid.GridCellAutoWrapStringEditor 使用多行文本控件来编辑数据值。