ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

wxpython中的网格控件

2022-05-27 09:32:53  阅读:210  来源: 互联网

标签:控件 self 网格 wxpython grid row col wx


创建网格

网格控件是用以显示一个二维的数据集的。要使用该控件显示有用的信息,你需要告诉该控件它工作所基于的是什么数据。在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()。

使用网格表创建网格

对于较复杂的情况,你可以将你的数据保存在一个网格表中,网格表是一个单独的类,它存储数据并与网格控件交互以显示数据。推荐在下列情况下使用网格表:
  • 网格的数据比较复杂
  • 数据存储在你的系统中的另外的对象中
  • 网格太大以致于不能一次整个被存储到内存中
要使用一个网格表,你需要要创建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个方法。当然也可以覆盖更多。
  • GetNumberCols():返回显示在网格中的列的数目
  • GetNumberRows():返回显示在网格中的行的数目
  • GetValue(row, col):返回坐标(row, col)处的值
  • IsEmptyCell(row, col):如果坐标(row, col)处的单元格为空的话,返回True。否则返回False。
  • SetValue(row, col, value):如果你需要的话,它使你能够更新你底层的数据结构以匹配用户的编辑。对于一个只读的表,你仍然需要声明该方法,但是你可以通过pass来使它什么也不做。该方法在当用户编辑一个单元格时自动被调用。
要将网格表实例附着于你的表的实例,要调用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有