wxPython电子表格功能wx.grid实例教程


Posted in Python onNovember 19, 2019

本文实例为大家分享了wxPython电子表格功能的具体代码,供大家参考,具体内容如下

#!/usr/bin/env python
#encoding: utf8 
import wx
import wx.grid as gridlib
#import wx.lib.mixins.grid as mixins

#---------------------------------------------------------------------------

class SimpleGrid(gridlib.Grid): ##, mixins.GridAutoEditMixin):
  def __init__(self, parent, log):
    gridlib.Grid.__init__(self, parent, -1)
    ##mixins.GridAutoEditMixin.__init__(self)
    #打印log信息
    self.log = log
    self.moveTo = None

    self.Bind(wx.EVT_IDLE, self.OnIdle)
    #创建一个25X25的电子表格
    self.CreateGrid(25, 25)#, gridlib.Grid.SelectRows)
    ##self.EnableEditing(False)

    #simple cell formatting
    #设置第index=3列的宽度大小,像素=200
    self.SetColSize(col=3,width=200)
    #设置第index=4行的高度大小,像素=45
    self.SetRowSize(4, 45)
    #设置 row=0,col=0,value="First cell"
    self.SetCellValue(0, 0, "First cell")
    #设置 row=1,col=1,value="Another cell"
    self.SetCellValue(1, 1, "Another cell")
    #设置 row=2,col=2,value="Yet another cell"
    self.SetCellValue(2, 2, "Yet another cell")
    #设置 row=3,col=3,value="This cell is read-only"
    self.SetCellValue(3, 3, "This cell is read-only")
    #设置字体格式
    self.SetCellFont(0, 0, wx.Font(12, wx.FONTFAMILY_ROMAN, wx.FONTSTYLE_ITALIC, wx.FONTWEIGHT_NORMAL))
    #设置字体颜色
    self.SetCellTextColour(1, 1, wx.RED)
    #设置cell背景颜色
    self.SetCellBackgroundColour(2, 2, wx.CYAN)
    #设置只读属性
    self.SetReadOnly(3, 3, True)
    #设置 row=5,col=0,数字编辑器
    self.SetCellEditor(5, 0, gridlib.GridCellNumberEditor(1,1000))
    #设置 row=5,col=0,value="123"
    self.SetCellValue(5, 0, "123")
    #设置 row=6,col=0,浮点数
    self.SetCellEditor(6, 0, gridlib.GridCellFloatEditor())
    #设置 row=6,col=0,value="123.34"
    self.SetCellValue(6, 0, "123.34")
    #设置
    self.SetCellEditor(7, 0, gridlib.GridCellNumberEditor())
    #设置 row=6,col=3,value="You can veto editing this cell"
    self.SetCellValue(6, 3, "You can veto editing this cell")

    #self.SetRowLabelSize(0)
    #self.SetColLabelSize(0)

    # attribute objects let you keep a set of formatting values
    # in one spot, and reuse them if needed
    #wx.grid.GridCellAttr

    #这个类可以用来通过改变它们的默认属性来改变网格在网格中的外观。
    attr = gridlib.GridCellAttr()
    #字体颜色:黑色
    attr.SetTextColour(wx.BLACK)
    #设置背景颜色:红色
    attr.SetBackgroundColour(wx.RED)
    #设置字体格式
    attr.SetFont(wx.Font(10, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))

    # you can set cell attributes for the whole row (or column)
    #设置Row=5,attr
    self.SetRowAttr(5, attr)

    #设置Col=0,LableValue =Custom
    self.SetColLabelValue(0, "Custom")
    #设置Col=1,LabelValue = "column"
    self.SetColLabelValue(1, "column")
    #设置Col=2,LabelValue = labels
    self.SetColLabelValue(2, "labels")
    #设置列表标签左右以及上下对齐方式:左对齐,下沉
    self.SetColLabelAlignment(wx.ALIGN_LEFT, wx.ALIGN_BOTTOM)

    #self.SetDefaultCellOverflow(False)
    #r = gridlib.GridCellAutoWrapStringRenderer()
    #self.SetCellRenderer(9, 1, r)

    #overflow cells
    self.SetCellValue( 9, 1, "This default cell will overflow into neighboring cells, but not if you turn overflow off.");
    #单元格合并处理:3x3
    self.SetCellSize(11, 1, 3, 3);
    #设置单元格对齐方式:中间,中间
    self.SetCellAlignment(11, 1, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE);
    #设置单元格值
    self.SetCellValue(11, 1, "This cell is set to span 3 rows and 3 columns");

    #设置
    editor = gridlib.GridCellTextEditor()
    #值长度
    editor.SetParameters('10')
    #设置格式
    self.SetCellEditor(0, 4, editor)
    #设置值
    self.SetCellValue(0, 4, "Limited text")

    #可以用来格式化单元格中的字符串数据。
    renderer = gridlib.GridCellAutoWrapStringRenderer()
    self.SetCellRenderer(15,0, renderer)
    self.SetCellValue(15,0, "The text in this cell will be rendered with word-wrapping")


    # test all the events
    #左单击
    self.Bind(gridlib.EVT_GRID_CELL_LEFT_CLICK, self.OnCellLeftClick)
    #右单击
    self.Bind(gridlib.EVT_GRID_CELL_RIGHT_CLICK, self.OnCellRightClick)
    #左双击
    self.Bind(gridlib.EVT_GRID_CELL_LEFT_DCLICK, self.OnCellLeftDClick)
    #右双击
    self.Bind(gridlib.EVT_GRID_CELL_RIGHT_DCLICK, self.OnCellRightDClick)

    #label 左单击
    self.Bind(gridlib.EVT_GRID_LABEL_LEFT_CLICK, self.OnLabelLeftClick)
    #label 右单击
    self.Bind(gridlib.EVT_GRID_LABEL_RIGHT_CLICK, self.OnLabelRightClick)
    #label 左双击
    self.Bind(gridlib.EVT_GRID_LABEL_LEFT_DCLICK, self.OnLabelLeftDClick)
    #label 右双击
    self.Bind(gridlib.EVT_GRID_LABEL_RIGHT_DCLICK, self.OnLabelRightDClick)


    self.Bind(gridlib.EVT_GRID_COL_SORT, self.OnGridColSort)

    #拖动Row大小
    self.Bind(gridlib.EVT_GRID_ROW_SIZE, self.OnRowSize)
    #拖动Col大小
    self.Bind(gridlib.EVT_GRID_COL_SIZE, self.OnColSize)

    self.Bind(gridlib.EVT_GRID_RANGE_SELECT, self.OnRangeSelect)
    self.Bind(gridlib.EVT_GRID_CELL_CHANGED, self.OnCellChange)
    self.Bind(gridlib.EVT_GRID_SELECT_CELL, self.OnSelectCell)

    self.Bind(gridlib.EVT_GRID_EDITOR_SHOWN, self.OnEditorShown)
    self.Bind(gridlib.EVT_GRID_EDITOR_HIDDEN, self.OnEditorHidden)
    self.Bind(gridlib.EVT_GRID_EDITOR_CREATED, self.OnEditorCreated)


  def OnCellLeftClick(self, evt):
    self.log.write("OnCellLeftClick: (%d,%d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
    evt.Skip()

  def OnCellRightClick(self, evt):
    self.log.write("OnCellRightClick: (%d,%d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
    evt.Skip()

  def OnCellLeftDClick(self, evt):
    self.log.write("OnCellLeftDClick: (%d,%d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
    evt.Skip()

  def OnCellRightDClick(self, evt):
    self.log.write("OnCellRightDClick: (%d,%d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
    evt.Skip()

  def OnLabelLeftClick(self, evt):
    self.log.write("OnLabelLeftClick: (%d,%d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
    evt.Skip()

  def OnLabelRightClick(self, evt):
    self.log.write("OnLabelRightClick: (%d,%d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
    evt.Skip()

  def OnLabelLeftDClick(self, evt):
    self.log.write("OnLabelLeftDClick: (%d,%d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
    evt.Skip()

  def OnLabelRightDClick(self, evt):
    self.log.write("OnLabelRightDClick: (%d,%d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
    evt.Skip()

  def OnGridColSort(self, evt):
    self.log.write("OnGridColSort: %s %s" % (evt.GetCol(), self.GetSortingColumn()))
    self.SetSortingColumn(evt.GetCol())

  def OnRowSize(self, evt):
    self.log.write("OnRowSize: row %d, %s\n" %
            (evt.GetRowOrCol(), evt.GetPosition()))
    evt.Skip()

  def OnColSize(self, evt):
    self.log.write("OnColSize: col %d, %s\n" %
            (evt.GetRowOrCol(), evt.GetPosition()))
    evt.Skip()

  def OnRangeSelect(self, evt):
    if evt.Selecting():
      msg = 'Selected'
    else:
      msg = 'Deselected'
    self.log.write("OnRangeSelect: %s top-left %s, bottom-right %s\n" %
              (msg, evt.GetTopLeftCoords(), evt.GetBottomRightCoords()))
    evt.Skip()


  def OnCellChange(self, evt):
    self.log.write("OnCellChange: (%d,%d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetPosition()))

    # Show how to stay in a cell that has bad data. We can't just
    # call SetGridCursor here since we are nested inside one so it
    # won't have any effect. Instead, set coordinates to move to in
    # idle time.
    value = self.GetCellValue(evt.GetRow(), evt.GetCol())

    if value == 'no good':
      self.moveTo = evt.GetRow(), evt.GetCol()


  def OnIdle(self, evt):
    if self.moveTo != None:
      self.SetGridCursor(self.moveTo[0], self.moveTo[1])
      self.moveTo = None

    evt.Skip()


  def OnSelectCell(self, evt):
    if evt.Selecting():
      msg = 'Selected'
    else:
      msg = 'Deselected'
    self.log.write("OnSelectCell: %s (%d,%d) %s\n" %
            (msg, evt.GetRow(), evt.GetCol(), evt.GetPosition()))

    # Another way to stay in a cell that has a bad value...
    row = self.GetGridCursorRow()
    col = self.GetGridCursorCol()

    if self.IsCellEditControlEnabled():
      self.HideCellEditControl()
      self.DisableCellEditControl()

    value = self.GetCellValue(row, col)

    if value == 'no good 2':
      return # cancels the cell selection

    evt.Skip()


  def OnEditorShown(self, evt):
    if evt.GetRow() == 6 and evt.GetCol() == 3 and \
      wx.MessageBox("Are you sure you wish to edit this cell?",
            "Checking", wx.YES_NO) == wx.NO:
      evt.Veto()
      return

    self.log.write("OnEditorShown: (%d,%d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
    evt.Skip()


  def OnEditorHidden(self, evt):
    if evt.GetRow() == 6 and evt.GetCol() == 3 and \
      wx.MessageBox("Are you sure you wish to finish editing this cell?",
            "Checking", wx.YES_NO) == wx.NO:
      evt.Veto()
      return

    self.log.write("OnEditorHidden: (%d,%d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetPosition()))
    evt.Skip()


  def OnEditorCreated(self, evt):
    self.log.write("OnEditorCreated: (%d, %d) %s\n" %
            (evt.GetRow(), evt.GetCol(), evt.GetControl()))



#---------------------------------------------------------------------------

class TestFrame(wx.Frame):
  def __init__(self, parent, log):
    wx.Frame.__init__(self, parent, -1, "Simple Grid Demo", size=(640,640))
    self.grid = SimpleGrid(self, log)



#---------------------------------------------------------------------------

if __name__ == '__main__':
  import sys
  print("hhh!!!")
  sys.stdout.write("hll"+"\n")
  if(0):#this section is modified by tony
    from wx.lib.mixins.inspection import InspectableApp
    app = InspectableApp(False)
  else:
    app = wx.App(False)
  frame = TestFrame(None, sys.stdout)
  if(0):#this section is modified by tony
    print(sys.stdout)
    print(type(sys.stdout))
  frame.Show(True)
  #import wx.lib.inspection
  #wx.lib.inspection.InspectionTool().Show()
  app.MainLoop()


#---------------------------------------------------------------------------

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python下使用Psyco模块优化运行速度
Apr 05 Python
简单理解Python中基于生成器的状态机
Apr 13 Python
编写Python小程序来统计测试脚本的关键字
Mar 12 Python
Python配置虚拟环境图文步骤
May 20 Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
Python中函数的返回值示例浅析
Aug 28 Python
Python容器使用的5个技巧和2个误区总结
Sep 26 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
python 实现端口扫描工具
Dec 18 Python
Python爬虫基础初探selenium
May 31 Python
Python OpenGL基本配置方式
May 20 Python
python 实现return返回多个值
Nov 19 #Python
wxPython实现带颜色的进度条
Nov 19 #Python
Python使用Pandas读写Excel实例解析
Nov 19 #Python
pycharm修改file type方式
Nov 19 #Python
wxPython实现列表增删改查功能
Nov 19 #Python
python ctypes库2_指定参数类型和返回类型详解
Nov 19 #Python
Python 使用type来定义类的实现
Nov 19 #Python
You might like
PHP数据库操作面向对象的优点
2006/10/09 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
php生成随机数的三种方法
2014/09/10 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
新浪的图片新闻效果
2007/01/13 Javascript
基于jquery点击自以外任意处,关闭自身的代码
2012/02/10 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
2016/08/24 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
2020/09/09 Javascript
Python将xml和xsl转换为html的方法
2015/03/10 Python
Python使用MONGODB入门实例
2015/05/11 Python
在Django的模板中使用认证数据的方法
2015/07/23 Python
python3.6使用pymysql连接Mysql数据库
2018/05/25 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
Python类型转换的魔术方法详解
2020/12/23 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
毕业生自荐书模版
2014/01/04 职场文书
人力资源经理自我评价
2014/01/04 职场文书
商业活动邀请函
2014/02/04 职场文书
旷课检讨书1000字
2014/02/14 职场文书
暑期社会实践感言
2014/02/25 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python