读书人

为wx.grid.Grid中的一个cell实现的edi

发布时间: 2013-08-06 16:47:25 作者: rapoo

为wx.grid.Grid中的一个cell实现的editor,遇到的问题
为一个BOOL类型的值实现了一个editor,当用户点击单元格时,创建一个RadioBox,用户只须要选择On或者Off。可以正常工作,具体代码如下。

但是有一点美中不足的就是,每次用户只能选择一次。也就是当用户选择了On之后,如果再选择Off,就会推出编辑模式,只有重新点击单元格,重新选择。调试了半天,发现只要一触发EndEdit,就会退出编辑模式。我希望只要用户点击在当前单元格,或者点击RadioBox内部,都不推出编辑模式。希望高手指点一下。

import wx
import wx.grid as grd
from wx.lib.masked.ipaddrctrl import IpAddrCtrl

class BoolEditor(grd.PyGridCellEditor):
def __init__(self, *args, **kwds):
grd.PyGridCellEditor.__init__(self)
self._args = args
self._kwds = kwds

def Create(self, parent, id, evtHandler):
sampleList = ["On", "Off"]
self._btn = wx.RadioBox(parent, -1, "", choices = sampleList, style = wx.BORDER_NONE)

self.SetControl(self._btn)
if evtHandler:
self._btn.PushEventHandler(evtHandler)

def SetSize(self, rect):
self._btn.SetDimensions(rect.x+5, rect.y-6, rect.width - 10, rect.height+5, wx.SIZE_ALLOW_MINUS_ONE)

def BeginEdit(self, row, col, grid):
self.startValue = grid.GetCellValue(row, col)
self._btn.SetStringSelection(self.startValue)

def EndEdit(self, row, col, grid):
changed = False
newValue = self._btn.GetStringSelection()
if newValue != self.startValue:
changed = True
grid.SetCellValue(row, col, newValue)
return changed

def Reset(self):
self._btn.SetStringSelection(self.startValue)


def Clone(self):
return BoolEditor()

class MyGrid(grd.Grid):
def __init__(self, parent):
grd.Grid.__init__(self, parent, -1, pos=(10,40), size=(420,150))

self.CreateGrid(3,3)

self.SetRowLabelSize(50)
self.SetColLabelSize(20)

self.SetDefaultRowSize(30)
self.SetColSize(2, 100)

font_grid = self.GetFont()
font_grid.SetPointSize(10)

self.attr1 = grd.GridCellAttr()
self.attr1.SetFont(font_grid)
self.attr1.SetEditor(BoolEditor())
self.attr1.SetAlignment(wx.ALIGN_LEFT, wx.ALIGN_CENTER)

self.SetAttr(0, 2, self.attr1)

class TestFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Custom cell editor test", size=(800,600))
grid = MyGrid(self)
grid.SetFocus()

self.CentreOnScreen()

if __name__ == '__main__':
app = wx.App(False)
frame = TestFrame(None)

frame.Show()
app.MainLoop()


[解决办法]
试试注释掉Create函数最后两行...

#if evtHandler:
#self._btn.PushEventHandler(evtHandler)

读书人网 >perl python

热点推荐