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 相关文章推荐
数据挖掘之Apriori算法详解和Python实现代码分享
Nov 07 Python
Python实现修改IE注册表功能示例
May 10 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
使用Python OpenCV为CNN增加图像样本的实现
Jun 10 Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 Python
python 中如何获取列表的索引
Jul 02 Python
python实现连连看辅助之图像识别延伸
Jul 17 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
Python合并2个字典成1个新字典的方法(9种)
Dec 19 Python
pytorch点乘与叉乘示例讲解
Dec 27 Python
python 深度学习中的4种激活函数
Sep 18 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 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 生成WML页面方法详解
2009/08/09 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
JQuery 小练习(实例代码)
2009/08/07 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
文本框获得焦点和失去焦点的判断代码
2012/03/18 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
JavaScript 实现打印,打印预览,打印设置
2014/12/30 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
[01:11]回顾历届DOTA2国际邀请赛中国区预选赛
2017/06/26 DOTA
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
python下载微信公众号相关文章
2019/02/26 Python
python中的句柄操作的方法示例
2019/06/20 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?
2016/08/13 面试题
房务中心文员岗位职责
2014/04/16 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
工作经验交流材料
2014/12/30 职场文书
挂靠协议书
2015/01/27 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers