为什么使用wx.grid.PyGridTableBase而不是wx.grid.Grid?
PyGridTableBase对于网格是一个模型类。
即为了做到 数据 和 控制器分离,更好的符合MVC结构,避免后期需要修改数据时改动底层代码
每次你创建一个PyGridTableBase时,有五个必要的方法必须被定义
GetNumberRows():返回一个表明grid中行数的整数。
GetNumberCols():返回一个表明grid中列数的整数。
IsEmptyCell(row, col):如果索引(row,col)所表示的单元是空的话,返回True。
GetValue(row, col):返回显示在单元(row,col)中的值。
SetValue(row, col,value):设置单元(row,col)中的值。如果你想要只读模式,你仍必须包含这个方法,但是你可以在该函数中使用pass。
由于wxPython必须有一个应用程序对象,而这个应用程序对象必须是类wx.App
或其定制的子类的一个实例。所以首先创建App类,并初始化方法OnInit()方法(强制,因为任何关于你的定制的类的所需的初始化通常都由OnInit()
方法管理)
class MyApp(wx.App):
def __init__(self):
wx.App.__init__(self)
def OnInit(self):
self.frame = MyFrame(None)
self.frame.Show()
self.SetTopWindow(self.frame)
return True # mandatory,否则报a 'bool' is expected not 'NoneType'
创建主窗口,继承wx.Frame,其中SimpleGrid是自定义函数,用来将列表以网格的形式在主窗口显示出来(注意父子窗口关系,主框架MyFrame的parent是MyApp)
class MyFrame(wx.Frame):
def __init__(self,parent):
wx.Frame.__init__(self,None,-1,"PyGridTableBase_test1",wx.DefaultPosition,wx.DefaultSize)
grid = SimpleGrid(self)
创建LineupTable类,继承wx.grid.PyGridTableBase类,用于构造表格的模型类,其GetNumberRows()、GetNumberCols()、IsEmptyCell(row, col)、GetValue(row, col)、SetValue(row, col,value)是使用wx.grid.PyGridTableBase类必须定义的函数
class LineupTable(wx.grid.PyGridTableBase):
data = (("CF", "Bob", "Dernier"), ("2B", "Ryne", "Sandberg"),
("LF", "Gary", "Matthews"), ("1B", "Leon", "Durham"),
("RF", "Keith", "Moreland"), ("3B", "Ron", "Cey"),
("C", "Jody", "Davis"), ("SS", "Larry", "Bowa"),
("P", "Rick", "Sutcliffe"))
colLabels = ("Last","First")
def __init__(self):
wx.grid.PyGridTableBase.__init__(self)
def GetNumberRows(self):
return len(self.data)
def GetNumberCols(self):
return len(self.data[0])
def IsEmptyCell(self,row,col):
return False
def GetValue(self,row,col):
return self.data[row][col]
# 只读模式下仍必须包含SetValue函数
def SetValue(self,row,col,value):
pass
def GetColLableValue(self,col):
return self.colLabels[col]
def GetRowLableValue(self,row):
return self.data[row][0]
接下来就是网格的控制类了,即将网格显示在主窗口
class SimpleGrid(wx.grid.Grid):
def __init__(self,parent):
wx.grid.Grid.__init__(self,parent, -1)
# 实例化
demo = LineupTable()
# PyGridTableBase对于网格是一个模型类,使用类中的方法SetTable来绘制表格
self.SetTable(demo, takeOwnership=True) #takeOwnership参数必须为True否则报0xC000041D
# 调用函数
tmp = demo.GetValue(3,1)
print(tmp)
最后就是实例化MyApp类,并循环运行事件
def main():
app = MyApp()
app.MainLoop()
if __name__ == '__main__':
main()
完整代码如下
import wx
import wx.grid
class LineupTable(wx.grid.PyGridTableBase):
data = (("CF", "Bob", "Dernier"), ("2B", "Ryne", "Sandberg"),
("LF", "Gary", "Matthews"), ("1B", "Leon", "Durham"),
("RF", "Keith", "Moreland"), ("3B", "Ron", "Cey"),
("C", "Jody", "Davis"), ("SS", "Larry", "Bowa"),
("P", "Rick", "Sutcliffe"))
colLabels = ("Last","First")
def __init__(self):
wx.grid.PyGridTableBase.__init__(self)
def GetNumberRows(self):
return len(self.data)
def GetNumberCols(self):
return len(self.data[0])
def IsEmptyCell(self,row,col):
return False
def GetValue(self,row,col):
return self.data[row][col]
# 只读模式下仍必须包含SetValue函数
def SetValue(self,row,col,value):
pass
def GetColLableValue(self,col):
return self.colLabels[col]
def GetRowLableValue(self,row):
return self.data[row][0]
class SimpleGrid(wx.grid.Grid):
def __init__(self,parent):
wx.grid.Grid.__init__(self,parent, -1)
# 实例化
demo = LineupTable()
# PyGridTableBase对于网格是一个模型类,使用类中的方法SetTable来绘制表格
self.SetTable(demo, takeOwnership=True) #takeOwnership参数必须为True否则报0xC000041D
# 调用函数
tmp = demo.GetValue(3,1)
print(tmp)
class MyFrame(wx.Frame):
def __init__(self,parent):
wx.Frame.__init__(self,None,-1,"PyGridTableBase_test1",wx.DefaultPosition,wx.DefaultSize)
grid = SimpleGrid(self)
class MyApp(wx.App):
def __init__(self):
wx.App.__init__(self)
def OnInit(self):
self.frame = MyFrame(None)
self.frame.Show()
self.SetTopWindow(self.frame)
return True # mandatory,否则报a 'bool' is expected not 'NoneType'
def main():
app = MyApp()
app.MainLoop()
if __name__ == '__main__':
main()