如何重写wx.grid.GridTableBase.SetRowLabelValue方法设置虚拟网格标签
解决方案
wx.grid.GridTableBase 本身没有内置的行、列标签存储空间,所有标签数据都需要你在派生类中自行维护。你需要同时实现标签写入的Set*方法和供网格读取标签的Get*方法,才能让自定义表头正常显示。
具体修改逻辑
- 在
HugeTable的初始化方法中新增两个列表,分别存储列标签和行标签,初始长度和表格的列数、行数对应 - 完善
SetColLabelValue、SetRowLabelValue方法,将传入的标签写入对应列表的指定索引位置 - 新增
GetColLabelValue、GetRowLabelValue方法,wxGrid 渲染表头时会主动调用这两个方法读取标签值
修改后完整代码
import wx import wx.grid gridcontents=[["x","x","x","x"],["y","y","y","y"],["z","z","z","z"],["l","l","l","l"]] class Frame(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, id=wx.ID_ANY) self.panel=wx.Panel(self) self.sizer=wx.BoxSizer(wx.VERTICAL) self.grid=wx.grid.Grid(self.panel, -1) self.CreateGrid() self.sizer.Add(self.grid,1,wx.EXPAND) self.panel.SetSizerAndFit(self.sizer) def CreateGrid(self): table = HugeTable() self.grid.SetTable(table,True) class HugeTable(wx.grid.GridTableBase): def __init__(self): wx.grid.GridTableBase.__init__(self) # 初始化列标签、行标签存储列表 self.col_labels = [""] * self.GetNumberCols() self.row_labels = [""] * self.GetNumberRows() # 测试设置第一列的列标签 self.SetColLabelValue(0,"列 1") def SetRowLabelValue(self, row, label): # 行号合法就存储标签 if 0 <= row < self.GetNumberRows(): self.row_labels[row] = label return True def SetColLabelValue(self, col, label): # 列号合法就存储标签 if 0 <= col < self.GetNumberCols(): self.col_labels[col] = label return True # 新增:供网格读取列标签的方法 def GetColLabelValue(self, col): if 0 <= col < self.GetNumberCols(): return self.col_labels[col] return "" # 新增:供网格读取行标签的方法 def GetRowLabelValue(self, row): if 0 <= row < self.GetNumberRows(): return self.row_labels[row] return "" def GetNumberRows(self): return len(gridcontents) def GetNumberCols(self): return len(gridcontents[0]) def IsEmptyCell(self, row, col): return False def GetValue(self, row, col): return str( gridcontents[row][col] ) app = wx.App() frm = Frame(None) frm.Show() app.MainLoop()
内容的提问来源于stack exchange,提问作者Asyu7
相关产品推荐
相关产品推荐

