编程语言
首页 > 编程语言> > wxpython中的网格控件

wxpython中的网格控件

作者:互联网

创建网格

网格控件是用以显示一个二维的数据集的。要使用该控件显示有用的信息,你需要告诉该控件它工作所基于的是什么数据。在wxPython中,有两种不同的机制用于在网格控件中处理数据,它们之间在处理数据的添加,删除和编辑的方式上有些许的不同。

较简单的一种是使用网格控件直接处理值。在这种情况下,网格维护着数据的一份拷贝。在这种情况下,如果有大量的数据或你的应用程序已经有了一个现存的网格类的数据结构,那么这可能显得比较笨拙。如果是这样,你可以使用一个网格表来处理该网格的数据。

创建简单的网格

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(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()。

使用网格表创建网格

对于较复杂的情况,你可以将你的数据保存在一个网格表中,网格表是一个单独的类,它存储数据并与网格控件交互以显示数据。推荐在下列情况下使用网格表: 要使用一个网格表,你需要要创建wx.grid.PyGridTableBase的子类。该子类必须覆盖父类wx.grid.GridTableBase的一些方法。下面展示一个实例:
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个方法。当然也可以覆盖更多。 要将网格表实例附着于你的表的实例,要调用SetTable(table,takeOwnership=False,selmode=wx.grid.Grid.SelectCells)方法。其中参数table是你的wx.grid.PyGridTableBase的实例。参数takeOwnership使得网格控件拥有这个表。如果takeOwnership为True,那么当网格被删除时,该表也被wxPython系统删除。参数selmode作用等同于在CreateGrid()中的作用。 你能够覆盖的另一个方法是Clear(),它在当对网格调用ClearGrid()时被调用,如果适当的话,你可以覆盖该方法来清除潜在的数据源。

 

标签:控件,self,网格,wxpython,grid,row,col,wx
来源: https://www.cnblogs.com/gxxtsz/p/16316275.html