wxpython中的网格控件
作者:互联网
创建网格
网格控件是用以显示一个二维的数据集的。要使用该控件显示有用的信息,你需要告诉该控件它工作所基于的是什么数据。在wxPython中,有两种不同的机制用于在网格控件中处理数据,它们之间在处理数据的添加,删除和编辑的方式上有些许的不同。
- 网格控件可以直接处理每行和每列中的值。
- 数据可以通过使用一个网格表(grid table)来间接地处理。
较简单的一种是使用网格控件直接处理值。在这种情况下,网格维护着数据的一份拷贝。在这种情况下,如果有大量的数据或你的应用程序已经有了一个现存的网格类的数据结构,那么这可能显得比较笨拙。如果是这样,你可以使用一个网格表来处理该网格的数据。
创建简单的网格
wx.gridGrid(parent, id=ID_ANY, pos=DefaultPosition, size=DefaultSize, style=WANTS_CHARS, name=GridNameStr)
wx.WANTS_CHARS样式是网格的默认样式,除此之外,wx.grid.Grid没有为自己定义特别的样式。由于网格类的复杂性,所以在程序中,你一般要自定义网格类的一个子类来实现一个网格,而非直接使用wx.grid.Grid的一个实例。 和我们所见过的别的控件不同,调用该构造函数不足以创建一个可用的网格。有两个方法用以初始化网格
- CreateGrid()
- SetTable()
CreateGrid(numRows, numCols, selmode=wx.grid.Grid.SelectCells)参数selmode指定了网格中单元格的选择模式,默认值是wx.grid.Grid.SelectCells,意思是一次只选择一个单元格。其它的值有wx.grid.Grid.SelectRows,意思是一次选择整个行,wx.grid.Grid.SelectionColumns,意思是一次选择整个列。 在内部,使用CreateGrid()初始化网格之后,wxPython设置了一个二维的字符串数组。一旦网格被初始化了,你就可以使用方法SetCellValue(row, col, s)来放置数据。如果你想获取特定坐标处的值,你可以使用函数GetCellValue(row, col),该函数返回字符串。要一次清空整个网格,你可以使用方法ClearGrid()。
使用网格表创建网格
对于较复杂的情况,你可以将你的数据保存在一个网格表中,网格表是一个单独的类,它存储数据并与网格控件交互以显示数据。推荐在下列情况下使用网格表:- 网格的数据比较复杂
- 数据存储在你的系统中的另外的对象中
- 网格太大以致于不能一次整个被存储到内存中
import wx import wx.grid class TestTable(wx.grid.GridTableBase): def __init__(self): wx.grid.GridTableBase.__init__(self) self.data = {(1, 1): "Here", (2, 2): "is", (3, 3): "some", (4, 4): "data", } self.odd = wx.grid.GridCellAttr() self.odd.SetBackgroundColour("sky blue") self.odd.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)) self.even = wx.grid.GridCellAttr() self.even.SetBackgroundColour("sea green") self.even.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)) # these five are the required methods def GetNumberRows(self): return 50 def GetNumberCols(self): return 50 def IsEmptyCell(self, row, col): return self.data.get((row, col)) is not None def GetValue(self, row, col): value = self.data.get((row, col)) if value is not None: return value else: return '' def SetValue(self, row, col, value): self.data[(row, col)] = value # the table can also provide the attribute for each cell def GetAttr(self, row, col, kind): attr = [self.even, self.odd][row % 2] attr.IncRef() return attr class TestFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title="Grid Table", size=(640, 480)) grid = wx.grid.Grid(self) table = TestTable() grid.SetTable(table, True) app = wx.App() frame = TestFrame() frame.Show() app.MainLoop()要使网格表有效,你必须覆盖5个方法。当然也可以覆盖更多。
- GetNumberCols():返回显示在网格中的列的数目
- GetNumberRows():返回显示在网格中的行的数目
- GetValue(row, col):返回坐标(row, col)处的值
- IsEmptyCell(row, col):如果坐标(row, col)处的单元格为空的话,返回True。否则返回False。
- SetValue(row, col, value):如果你需要的话,它使你能够更新你底层的数据结构以匹配用户的编辑。对于一个只读的表,你仍然需要声明该方法,但是你可以通过pass来使它什么也不做。该方法在当用户编辑一个单元格时自动被调用。
标签:控件,self,网格,wxpython,grid,row,col,wx 来源: https://www.cnblogs.com/gxxtsz/p/16316275.html