表格控件是wxPython中最复杂的控件之一,表格控件通常用于浏览数据。
一、表格控件的创建 wxPython的表格控件功能非常强大,提供了数据展示的方法。表格控件可以显示二维形式的数据。wxPython提供了wx.grid包,wx.grid包提供了创建和控制表格的方法。 下面使用Grid类创建一个二维表格:
#使用Grid类创建一个二维表格 import wx import wx.grid class MyFrame(wx.Frame): def __init__(self): #设置行 rowTitles = [u'第1行',u'第2行',u'第3行',u'第4行'] #设置列 colTitles = [u'第1列',u'第2列',u'第3列',u'第4列'] wx.Frame.__init__(self,None,title=u'表格',size=(450,200)) grid = wx.grid.Grid(self) #定义表格控件 grid.CreateGrid(4,4) #行列数 for row in range(4): grid.SetRowLabelValue(row,rowTitles[row]) #设置行标题 grid.SetColLabelValue(row,colTitles[row]) #设置列标题 for col in range(4): grid.SetCellValue(row,col,str(col)) if __name__=='__main__': app = wx.PySimpleApp() frame = MyFrame() frame.Show() app.MainLoop()二、通过PyGridTable创建表格 表格控件还可以通过PyGridTable来创建,PyGridTable可以制定更复杂的表格。通过继承PyGridTableBase()类可以实现对表格控件更复杂的设置,继承PyGridTableBase类必须实现GetAttr()、Get Number Rows()、GetNumberCols()、GetValue()和SetValue()这些方法。设置表格的奇数行和偶数行的颜色便于数据浏览,是程序界面设计中经常需要实现的功能。 下面演示PyGridTable创建区分奇数行和偶数行的表格控件:
#演示PyGridTable创建区分奇数行和偶数行的表格控件 import wx import wx.grid as grid class OddEvenTable(grid.PyGridTableBase): def __init__(self): grid.PyGridTableBase.__init__(self) self.odd = grid.GridCellAttr() #获取奇数行 #设置偶数行的背景为黄色 self.odd.SetBackgroundColour("yellow") self.even = grid.GridCellAttr #获取偶数列 #对每个单元格进行控制 def GetAttr(self,row,col,kind): #对奇、偶行进行过滤 attr = [self.even,self.odd][row % 2] attr.IncRef() #(这一句有问题) return attr def GetNumberRows(self): return 8 def GetNumberCols(self): return 10 #Grid类的setTable()被调用时,此方法被调用 def GetValue(self,row,col): #返回第row行第col列的值 return str(col) #当对单元格设置值时,此方法被调用 def SetValue(self,row,col,value): #设置第row行第col列的值 print(row,col,value) #在主程序MyFrame类中调用OddEvenTable类设置表格的样式和内容 class MyFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self,None,-1,u"表格的方法",size=(900,300)) gd = grid.Grid(self) table = OddEvenTable() gd.SetTable(table,True) if __name__=='__main__': app = wx.PySimpleApp() frame = MyFrame() frame.Show() app.MainLoop()三、表格控件的单元格 表格控件的单元格可以根据不同的数据需求进行设置,例如,可以把某个单元格设置为下拉列表、复选框、数字选择等控件。此外,单元格可以对数据的字体、颜色、格式进行设置。 下面演示wx.grid包中提供的各种Editor编辑器的使用以及单元格样式的设置方法:
#表格控件的单元格 import wx import wx.grid as grid class SimpleGrid(grid.Grid): def __init__(self,parent): grid.Grid.__init__(self,parent,-1) self.CreateGrid(8,4) #调用EnableEditing()方法,使单元格可以被编辑 self.EnableEditing(True) #设置表格第1列的标题,并设置标题的对齐方式为左下对齐 self.SetColLabelValue(0,u'第1列') #设置列标题 self.SetColLabelAlignment(wx.ALIGN_LEFT,wx.ALIGN_BOTTOM) #设置表格第1行的标题,并设置标题的对齐方式为右下对齐 self.SetRowLabelValue(0,u'第1行') #设置行标题 self.SetRowLabelAlignment(wx.ALIGN_RIGHT,wx.ALIGN_BOTTOM) self.SetCellValue(0,0,"Hello") #设置坐标(0,0)的值为“Hello” self.SetCellTextColour(0,0,wx.RED) #设置单元格的字体 self.SetCellFont(0,0,wx.Font(10,wx.ROMAN,wx.ITALIC,wx.NORMAL)) #设置第2行第1列单元格为 只读 状态,并且背景色为红色 self.SetCellValue(1,0,"Read Only") self.SetReadOnly(1,0,True) #设置只读单元格 self.SetCellBackgroundColour(1,0,wx.RED) #设置单元格的背景颜色 #使用数字选择编辑器GridCellNumberEditor,创建可从1到10选择的编辑器 self.SetCellEditor(2,0,grid.GridCellNumberEditor(1,10)) #嵌入数字选择控件 self.SetCellValue(2,0,'1') #使用浮点数,小数精度为1,编辑10.19时自动“四舍五入”,变为10.2 self.SetCellEditor(2,1,grid.GridCellFloatEditor(0,1)) #嵌入浮点数编辑控件 self.SetCellValue(2,1,"10.19") #获取属性对象attr,并调用attr的SetTextColour设置字体的颜色 attr = grid.GridCellAttr() attr.SetTextColour(wx.BLUE) self.SetColAttr(1,attr) #设置一列的单元格属性(第二列字体颜色) self.SetCellAlignment(5,1,wx.ALIGN_CENTER,wx.ALIGN_BOTTOM) #设置从第6行第2列开始的跨两行、两列的单元格 self.SetCellSize(5,1,2,2) #设置跨行、列的单元格 #嵌入下拉列表 #设置GridCellChoiceEditor编辑器,其中包括one、two、three三个选项,默认为one,当编辑时将显示下拉列表 self.SetCellEditor(6,0,grid.GridCellChoiceEditor(["one","two","three"])) self.SetCellValue(6,0,"noe") #嵌入复选列表 self.SetCellEditor(7,0,grid.GridCellBoolEditor()) self.SetCellValue(7,0,"True") #默认值为True,将显示复选框控件 class MyFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self,None,-1,u'单元格的设置',size=(500,300)) self.grid = SimpleGrid(self) if __name__=="__main__": app = wx.PySimpleApp() frame = MyFrame() frame.Show() app.MainLoop()四、处理单元格的事件 表格控件支持大部分的鼠标和键盘的响应事件,这些事件可以对某个单元格进行操作。下面是实现鼠标的单击、右击、单元格选择和键盘输入等事件。单元格的事件处理原理和其他控件的处理方法相同,首先绑定单元格的事件,指定事件处理函数,然后实现事件处理函数。
#!/sur/bin/env python # -*- coding:utf-8 -*- # author: fengderong time:2020/10/20 #处理单元格的事件 import wx import wx.grid as grid import pprint class MyGrid(grid.Grid): def __init__(self,parent): grid.Grid.__init__(self,parent,-1) self.CreateGrid(5,5) #表格的事件 self.Bind(grid.EVT_GRID_CELL_LEFT_CLICK,self.OnCellLeftClick) #当单击鼠标左键时触发 self.Bind(grid.EVT_GRID_CELL_RIGHT_CLICK,self.OnCellRightClick)#当单击鼠标右键时触发 self.Bind(grid.EVT_GRID_SELECT_CELL,self.OnSelectCell) #当选择单元格时发生 self.Bind(grid.EVT_GRID_RANGE_SELECT,self.OnRangeSelect) #当选择多个单元格时触发 self.Bind(grid.EVT_GRID_CELL_CHANGED,self.OnCellChange) #当单元格内容改变时触发 #当编辑单元时触发的事件 self.Bind(grid.EVT_GRID_EDITOR_SHOWN,self.OnEditorShown) self.Bind(grid.EVT_GRID_EDITOR_HIDDEN,self.OnEditorHidden) self.Bind(grid.EVT_GRID_EDITOR_CREATED,self.OnEditorCreated) #响应键盘输入 self.Bind(wx.EVT_KEY_DOWN,self.OnKeyDown) def OnCellLeftClick(self,evt): print("(% d,% d)"% (evt.GetRow(),evt.GetCol())) evt.Skip def OnCellRightClick(self,evt): wx.MessageBox("% s"% (evt.GetPosition()),u'提示') evt.Skip() def OnRangeSelect(self,evt): if evt.Selecting(): print("(% s,% s)"% (evt.GetTopLeftCoords(),evt.GetBottomRightCoords())) evt.Skip() def OnCellChange(self,evt): value = self.GetCellValue(evt.GetRow(),evt.GetCol()) print(value) def OnSelectCell(self,evt): self.SetCellBackgroundColour(evt.GetRow,evt.GetCol(),wx.RED) evt.Skip() def OnEditorShown(self,evt): print("show") evt.Skip() def OnEditorHidden(self,evt): print("hidden") evt.Skip() def OnEditorCreated(self,evt): print(evt.GetControl()) evt.Skip() def OnKeyDown(self,evt): value = evt.GetPosition() pp = pprint.PrettyPrinter() pp.pprint(value) print("KeyCode:" + str(evt.GetKeyCode())) evt.Skip() class MyFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self,None,-1,u'表格的事件',size=(500,200)) self.grid = MyGrid(self) if __name__=='__main__': app = wx.PySimpleApp() frame = MyFrame() frame.Show() app.MainLoop()(最近学习的内容比较少,有点懒了哦~,把学习到的代码笔记奉献在这咯,大家一起努力鸭!)