为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)