wx.grid
wxPython控件学习之wx.grid.Grid (包括对GridCellEditor和GridCelRender的扩展,以支持更多的grid cell 样式, 以GridCellColorEditor为例)
2012年10月08日 ⁄ 综合 ⁄ 共 10983字 ⁄ 字号 小 中 大 ⁄ 评论关闭
30元程序员衣装优惠券,仅剩3天!点击领取 wx.Grid 及其相关的类是用来显示和编辑类表格样式的数据。该控件为显示,编辑数据源提及交互供了丰富的特征。 wx.GridTableBase类控制要显示的实际数据。可以call CreateGrid()产生一个该类的实例对象。 wx.GridCellRenderer 基类,负责对单元格进行绘画。现在提供了默认的几种派生。 wxGridCellBoolRenderer 显示CheckBox样式
wxGridCellFloatRenderer
wxGridCellNumberRenderer
wxGridCellStringRenderer
wx.GridCellEditor 基类,负责在cell editing状态下,显示对应的控件。现在提供了默认的几种派生。 wxGridCellBoolEditor
wxGridCellChoiceEditor
wxGridCellFloatEditor
wxGridCellNumberEditor
wxGridCellTextEditor
如何添加、删除行,列和单元格?
本例中使用SetTable() 作为grid 的数据源。 那么重点来研究在这个情况下如何对grid 和 数据源进行增删改。 GridTableMessage 类,可以用来向表发送一些message,本例中 是对行的增删改操作, 那么我们只需要用其中的3个message: GRIDTABLE_NOTIFY_ROWS_INSERTED 行插入的消息
GRIDTABLE_NOTIFY_ROWS_APPENDED 附近新行的消息
GRIDTABLE_NOTIFY_ROWS_DELETED 删除行的消息 GRIDTABLE_REQUEST_VIEW_GET_VALUES cell 值如果有更改的消息 1.在index插入一新行 grd.GridTableMessage(self,
grd.GRIDTABLE_NOTIFY_ROWS_INSERTED
,index 改行所在的索引
,1 插入一行记录
) 2. 删除rowIndex行 grd.GridTableMessage(self,grd.GRIDTABLE_NOTIFY_ROWS_DELETED,
rowIndex, 改行所在的索引
1 只删除一行 ) 3. 附加一新行 grd.GridTableMessage(self,
grd.GRIDTABLE_NOTIFY_ROWS_APPENDED,
1 附近的新行个数
) #-*-coding:utf-8 #-------------------------------------------------------------------------------
# Name: 模块1
# Purpose:
#
# Author: ankier
#
# Created: 14/10/2012
# Copyright: (c) ankier 2012
# Licence: <your licence>
#------------------------------------------------------------------------------- import wx, wx.grid as grd #grid column类型
class GridColumnControlKind:
Text ="Text"
CheckBox = "CheckBox"
Colour = "Colour" #定购的Grid cell color editor
class GridCellColorEditor(grd.PyGridCellEditor):
def Create(self, parent, id, evtHandler):
"""
Called to create the control, which must derive from wx.Control.
*Must Override*
"""
self.__Parent = parent
self.__ColorDialog = None
self.__ColorButton = wx.Button(parent, id, "")
self.SetControl(self.__ColorButton)
#添加新的event handler, 防止 弹出窗口后, cell 自动editor
newEventHandler = wx._core.EvtHandler()
if evtHandler:
self.__ColorButton.PushEventHandler(newEventHandler)
self.__ColorButton.Bind(wx.EVT_BUTTON, self.OnClick) def OnClick(self, event):
self.__ColorButton.SetFocus()
self.ShowColorDialog() def SetSize(self, rect):
"""
Called to position/size the edit control within the cell rectangle.
If you don't fill the cell (the rect) then be sure to override
PaintBackground and do something meaningful there.
"""
self.__ColorButton.SetDimensions(rect.x,rect.y,rect.width+2,rect.height+2,wx.SIZE_ALLOW_MINUS_ONE) def Clone(self):
"""
Create a new object which is the copy of this one
*Must Override*
"""
return GridCellColorEditor() def BeginEdit(self, row, col, grid):
"""
Fetch the value from the table and prepare the edit control
to begin editing. Set the focus to the edit control.
*Must Override*
"""
self.startValue = grid.GetTable().GetValue(row, col)
self.endValue = self.startValue
self.__ColorButton.SetBackgroundColour(self.startValue) def EndEdit(self, row, col, grid):
"""
Complete the editing of the current cell. Returns True if the value
has changed. If necessary, the control may be destroyed.
*Must Override*
"""
changed = False
if self.endValue != self.startValue:
changed = True
grid.GetTable().SetValue(row, col, self.endValue) # update the table
self.startValue = ''
return changed def ShowColorDialog(self):
colorDialog = wx.ColourDialog(self.__Parent)
self.__ColorDialog = colorDialog
colorDialog.GetColourData().SetColour(self.startValue)
if wx.ID_OK == colorDialog.ShowModal():
data = colorDialog.GetColourData()
colour = data.GetColour()
self.__ColorButton.SetBackgroundColour(colour)
self.endValue = colour del self.__ColorDialog
self.__ColorDialog = None #定购颜色cell colour column
class GridCellColorRender(grd.PyGridCellRenderer):
def __init__(self):
grd.PyGridCellRenderer.__init__(self) def Draw(self, grid, attr, dc, rect, row, col, isSelected):
color = grid.GetTable().GetValue(row, col)
dc.SetBrush(wx.Brush(color, wx.SOLID))
dc.SetPen(wx.TRANSPARENT_PEN)
dc.DrawRectangleRect(rect) dc.SetBackgroundMode(wx.TRANSPARENT)
def GetBestSize(self, grid, attr, dc, row, col):
# text = grid.GetCellValue(row, col)
# dc.SetFont(attr.GetFont())
# w, h = dc.GetTextExtent(text)
return wx.Size(-1, -1) def Clone(self):
return GridCellColorRender() #根据具体业务逻辑 定购grid的 table
class CustomGridTable(grd.PyGridTableBase):
def __init__(self):
grd.PyGridTableBase.__init__(self) #添加Grid column head
self.colLabels = ["Name", "Visibility", "Min threshold", "Max threshold", "Colour"]
#指定column对应的kind control
self.colControlKinds = [GridColumnControlKind.Text, GridColumnControlKind.CheckBox, GridColumnControlKind.Text, GridColumnControlKind.Text, GridColumnControlKind.Colour]
self.colControlEditorEnableStatus =[True, True, False, False, True]
self.rowLabels = ["","","","",""] #添加数据源
self.Data = [
['Mask 1', 1, "2.5","320.6",(200,20,100)]
,['Mask 2', 1, "2.5","320.6",(50,0,200)]
] def GetNumberRows(self):
return len(self.Data) def GetNumberCols(self):
return len(self.colLabels) def IsEmptyCell(self, row, col):
return False def GetValue(self, row, col):
return self.Data[row][col] def SetValue(self, row, col, value):
self.Data[row][col] = value def GetColLabelValue(self, col):
return self.colLabels[col] def GetRowLabelValue(self, row):
return self.rowLabels[row] def InsertRow(self, index, row):
if len(self.Data) < index:
return self.Data.insert(index, row)
print self.Data
self.GetView().BeginBatch() msg = grd.GridTableMessage(self,
grd.GRIDTABLE_NOTIFY_ROWS_INSERTED
,index
,1
)
self.GetView().ProcessTableMessage(msg) # ... same thing for columns .... self.GetView().EndBatch()
msg = grd.GridTableMessage(self, grd.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
self.GetView().ProcessTableMessage(msg) def DeleteRow(self, row):
rowIndex = self.Data.index(row )
if rowIndex <0:
return self.Data.remove(row) self.GetView().BeginBatch() msg = grd.GridTableMessage(self,grd.GRIDTABLE_NOTIFY_ROWS_DELETED,
rowIndex,
)
self.GetView().ProcessTableMessage(msg) # ... same thing for columns .... self.GetView().EndBatch()
msg = grd.GridTableMessage(self, grd.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
self.GetView().ProcessTableMessage(msg) def Clear(self): self.GetView().BeginBatch() msg = grd.GridTableMessage(self,grd.GRIDTABLE_NOTIFY_ROWS_DELETED,
0,
self.GetNumberCols()-1)
self.GetView().ProcessTableMessage(msg) # ... same thing for columns .... self.GetView().EndBatch() self.Data = [] msg = grd.GridTableMessage(self, grd.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
self.GetView().ProcessTableMessage(msg) def AppendRow(self, row):
self.Data.append(row)
self.GetView().BeginBatch() msg = grd.GridTableMessage(self,
grd.GRIDTABLE_NOTIFY_ROWS_APPENDED, )
self.GetView().ProcessTableMessage(msg) # ... same thing for columns .... self.GetView().EndBatch()
msg = grd.GridTableMessage(self, grd.GRIDTABLE_REQUEST_VIEW_GET_VALUES)
self.GetView().ProcessTableMessage(msg) #对grid的功能进行封装 以便能方便的处理
class CustomGrid(grd.Grid):
def __init__(self, parent, id, rowLabelSize = 0, customGridTable = None):
grd.Grid.__init__(self, parent,id) self.RowLabelSize = rowLabelSize
self.__CustomTableSource = customGridTable
self.SetTable(self.__CustomTableSource, True) self.__InitStyle() #设置column 对应的 editor
self.__InitColumnsEditor() # self.Bind(grd.EVT_GRID_CELL_LEFT_CLICK,self.__OnMouse)
self.Bind(grd.EVT_GRID_SELECT_CELL, self.__OnCellSelected)
self.Bind(grd.EVT_GRID_EDITOR_CREATED, self.__OnEditorCreated) def __InitStyle(self):
self.SetSelectionBackground(wx.Color(237 , 145 , 33 )) def __InitColumnsEditor(self):
index = -1
for columnKind in self.__CustomTableSource.colControlKinds:
index += 1
if columnKind == GridColumnControlKind.CheckBox:
self.__InitCheckBoxColumnEditor(index)
elif columnKind == GridColumnControlKind.Colour:
self.__InitColorColumnEditor(index) def __InitCheckBoxColumnEditor(self, columnIndex):
attr = grd.GridCellAttr()
attr.SetEditor(grd.GridCellBoolEditor())
attr.SetRenderer(grd.GridCellBoolRenderer())
self.SetColAttr(columnIndex, attr) def __InitColorColumnEditor(self, columnIndex):
attr = grd.GridCellAttr()
attr.SetEditor(GridCellColorEditor())
attr.SetRenderer(GridCellColorRender())
self.SetColAttr(columnIndex, attr) def __OnCellSelected(self,evt):
if self.__CustomTableSource.colControlEditorEnableStatus[evt.Col]:
wx.CallAfter(self.EnableCellEditControl)
evt.Skip()
#设置改行为选中状态
self.SelectRow(evt.Row) def __OnEditorCreated(self, event):
pass def ForceRefresh(self):
grd.Grid.ForceRefresh(self) #主窗口
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None,title="GridTable",size=(500,200))
sizer = wx.BoxSizer(wx.HORIZONTAL)
addButton = wx.Button(self, -1, "Add")
deleteButton = wx.Button(self, -1, "Delete")
clearButton = wx.Button(self, -1, "Clear")
sizer.Add(addButton, 0, wx.SHAPED)
sizer.Add(deleteButton, 0, wx.SHAPED)
sizer.Add(clearButton, 0, wx.SHAPED) table = CustomGridTable()
grid = CustomGrid(self, id = -1, customGridTable = table)
self.__Grid = grid
mainSizer = wx.BoxSizer(wx.VERTICAL)
mainSizer.Add(sizer)
mainSizer.Add(grid, 1, wx.EXPAND)
self.SetSizerAndFit(mainSizer) addButton.Bind(wx.EVT_BUTTON, self.OnAddClick)
deleteButton.Bind(wx.EVT_BUTTON, self.OnDeleteClick)
clearButton.Bind(wx.EVT_BUTTON, self.OnClearClick) def OnClearClick(self, event):
table = self.__Grid.GetTable()
table.Clear()
print self.__Grid.GetTable().Data def OnDeleteClick(self, event):
table = self.__Grid.GetTable()
firstRow = table.Data[1]
table.DeleteRow(firstRow)
print self.__Grid.GetTable().Data def OnAddClick(self, event):
table = self.__Grid.GetTable()
table.InsertRow(1, ['insert index ', 1, "2.5","110.6",(50,200,30)])
print self.__Grid.GetTable().Data def main():
app = wx.PySimpleApp()
frame = TestFrame()
frame.Show()
app.MainLoop() if __name__ == '__main__':
main() #-*-coding:utf-8 #-------------------------------------------------------------------------------
# Name: 模块1
# Purpose:
#
# Author: ankier
#
# Created: 14/10/2012
# Copyright: (c) ankier 2012
# Licence: <your licence>
#------------------------------------------------------------------------------- import wx, wx.grid as grd #定购的Grid cell ComboBox editor
class GridCellComboBoxEditor(grd.PyGridCellEditor):
def __init__(self, choices = []):
grd.PyGridCellEditor.__init__(self)
self.__Choices = choices def Create(self, parent, id, evtHandler):
"""
Called to create the control, which must derive from wx.Control.
*Must Override*
"""
self.__Parent = parent
self.__ComboBoxDialog = None
self.__ComboBoxButton = wx.ComboBox(parent, id, value = "", choices =self.__Choices)
self.__ComboBoxButton.SetEditable(False)
self.SetControl(self.__ComboBoxButton)
#添加新的event handler, 防止 弹出窗口后, cell 自动editor
newEventHandler = wx._core.EvtHandler()
if evtHandler:
self.__ComboBoxButton.PushEventHandler(newEventHandler)
self.__ComboBoxButton.Bind(wx.EVT_COMBOBOX, self.OnClick) def OnClick(self, event):
self.endValue = self.__ComboBoxButton.GetStringSelection() def SetSize(self, rect):
"""
Called to position/size the edit control within the cell rectangle.
If you don't fill the cell (the rect) then be sure to override
PaintBackground and do something meaningful there.
"""
self.__ComboBoxButton.SetDimensions(rect.x,rect.y,rect.width+2,rect.height+2,wx.SIZE_ALLOW_MINUS_ONE) def Clone(self):
"""
Create a new object which is the copy of this one
*Must Override*
"""
return GridCellComboBoxEditor() def BeginEdit(self, row, col, grid):
"""
Fetch the value from the table and prepare the edit control
to begin editing. Set the focus to the edit control.
*Must Override*
"""
self.startValue = grid.GetTable().GetValue(row, col)
self.endValue = self.startValue
self.__ComboBoxButton.SetStringSelection(self.startValue) def EndEdit(self, row, col, grid):
"""
Complete the editing of the current cell. Returns True if the value
has changed. If necessary, the control may be destroyed.
*Must Override*
"""
changed = False
if self.endValue != self.startValue:
changed = True
grid.GetTable().SetValue(row, col, self.endValue) # update the table
self.startValue = ''
return changed #定购颜色cell colour column
class GridCellComboBoxRender(grd.GridCellStringRenderer):
def __init__(self):
grd.GridCellStringRenderer.__init__(self)
wx.grid的更多相关文章
- wx.grid.Grid
# -*- coding: cp936 -*- import wx import wx.grid import wx.lib.gridmovers as gridmovers import pymss ...
- wx.grid 简单例子
import wx, wx.grid class GridData(wx.grid.PyGridTableBase): _cols = "a b c".split() _data ...
- wxPython控件学习之wx.grid.Grid 表格控件
wxPython控件学习之wx.grid.Grid (包括对GridCellEditor和GridCelRender的扩展,以支持更多的grid cell 样式, 以GridCellColorEdit ...
- wx
wx The classes in this module are the most commonly used classes for wxPython, which is why they hav ...
- 46-wxpython 4 使用 grid 展示表格
转载:https://blog.csdn.net/soslinken/article/details/79024938#%E4%BD%BF%E7%94%A8%E6%A0%B7%E4%BE%8B wxp ...
- wxpython grid
构建Grid方法,效果如下: 其它构建grid方法和grid的使用见:还可以见下载资源中的wxpython教程第5章的 gridGeneric.py gridModel.py gridNoModel. ...
- wxPYTHON图形化软件开发(一)---LOMO工具箱
最近学了wxPYTHON,这次就做了一个工具箱软件练手,软件主要是包含各种小工具,目前想到的有密码管理器,日记本,记账本,今天还看到一个网页浏览器,也可能加进来.目前实现的是密码管理器 软件GUI部分 ...
- [ZETCODE]wxWidgets教程九:组件专题2
本教程原文链接:http://zetcode.com/gui/wxwidgets/widgetsII/ 翻译:瓶哥 日期:2013年12月15日星期日 邮箱:414236069@qq.com 主页:h ...
- [wxWidgets]_[0基础]_[经常更新进度条程序]
场景: 1. 非常根据程序的进展需要处理业务,以更新进度条,进度条的目的是为了让用户知道业务流程的进度.一个进度条程序更友好,让用户知道在程序执行.不是没有反应. 2. 现在更新见过这两种方法的进展. ...
随机推荐
- php 对象方式传入参数
类是单例模式,对象方式传入参数,如果参数过多是,使用形参容易混乱 class Object { /** * 基本配置信息 * @var array */ private $config = array ...
- windows系统如何校验MD5
需要首先安装openssl软件. 若安装了git for windows,则默认会带有openssl,不需要单独安装了. 打开git bash控制台,执行如下命令即可—— openssl md5 pa ...
- URL 地址传中文,转码
地址传中文,转码 http://community.csdn.net/Expert/topic/4541/4541877.xml?temp=.57688541.设置web.config文件.<s ...
- POJ_2407 Relatives 【欧拉函数裸题】
一.题目 Given n, a positive integer, how many positive integers less than n are relatively prime to n? ...
- vue2.0小小记录
1.关于路由跳转方法:push this.$router.push({name:'master',params:{id:'参数'}}); //name和params搭配,刷新的话,参数会消失 this ...
- java单元测试之Mock静态方法
1 public final class AmountUtil { public static String CustomFormatWith2Digits(int amount) { return ...
- RNN(recurrent neural network)学习笔记
参考:https://www.jianshu.com/p/9dc9f41f0b29 以及<白话深度学习与TensorFlow> 与前馈神经网络.卷积神经网络等不同之处在于,RNN具有一定 ...
- 集成 Jenkins 和 TestNG 实现自助式自动化测试平台
背景介绍 在软件业十分成熟的今天,敏捷(Agile)开发在业界日益流行,而面临的挑战也日益增多,不断变化的用户需求.缩短的开发周期.频繁的部署上线.复杂的产品架构和团队组织,如何继续保证软件的质量是一 ...
- css引入 以及选择器040
css的介绍: css(Cascading Style Sheet) 层叠样式表 作用就是给HTML页面标签议案家各种样式 定义网页效果 简单来说 就是讲网页内容和显示样式进行分离 , 提高了显示功 ...
- 转 Nmon 监控生成数据文件字段的介绍
##发现nomon 一个好用的功能 数据透视图 PIVOTCHART:这些参数被用来构建数据透视图.所需的参数:Sheetname,PageField,rowfield,columnfield,Dat ...