[wxPython]网格模型类wx.grid.PyGridTableBase

为什么使用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()

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值