首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

为wx.grid.Grid中的一个cell实现的editor,遇到的有关问题

2013-08-06 
为wx.grid.Grid中的一个cell实现的editor,遇到的问题为一个BOOL类型的值实现了一个editor,当用户点击单元

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

热点排行