在wxGrid中增加wxDataPickerCtrl控件

编写环境:

1、ActivePython-2.7.2.5-win32-x86

2、wxPython2.8-win32-unicode-2.8.12.1-py27

3、wxFormBuilder_v3.3.3-beta

 

以下代码是演示如何在wxGrid中增加wxDataPickerCtrl控件的代码,是我查了好久才找到的。

import wx 
import wx.grid 

class DatePickerCellEditor(wx.grid.PyGridCellEditor): 
    def __init__(self): 
        wx.grid.PyGridCellEditor.__init__(self) 

    def Create(self, parent, id, evtHandler): 
        """ 
        Called to create the control, which must derive from wx.Control. 
        *Must Override* 
        """ 
        self._tc = wx.DatePickerCtrl(parent, id, size=(120,-1), style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY) 
        self.SetControl(self._tc) 

        if evtHandler: 
            self._tc.PushEventHandler(evtHandler) 


    def SetSize(self, rect): 
        """ 
        Called to position/size the edit control within the cell rectangle. 
        If you don't fill the cell (the rect) then be sure to override 
        PaintBackground and do something meaningful there. 
        """ 
        self._tc.SetDimensions(rect.x, rect.y, rect.width+2, rect.height+2, wx.SIZE_ALLOW_MINUS_ONE) 

    def BeginEdit(self, row, col, grid): 
        """ 
        Fetch the value from the table and prepare the edit control 
        to begin editing.  Set the focus to the edit control. 
        *Must Override* 
        """ 
        s = grid.GetTable().GetValue(row, col) 
        d = wx.DateTime.Now() 
        try: 
            d.SetDay(int(s[:2])) 
            d.SetMonth(int(s[2:4])-1) 
            d.SetYear(int(s[4:8])) 
            self._tc.SetValue(d) 
        except: 
            pass 
        self.startValue = s 
        print self.startValue 
        #print 'self.startValue', self.startValue, type(self.startValue) 
        self._tc.SetValue(d) 
        #self._tc.SetInsertionPointEnd() 
        self._tc.SetFocus() 
        #self._tc.SetSelection(0, self._tc.GetLastPosition()) 

    def EndEdit(self, row, col, grid): 
        """ 
        Complete the editing of the current cell. Returns True if the value 
        has changed.  If necessary, the control may be destroyed. 
        *Must Override* 
        """ 
        changed = False 

        #val = str(self._tc.GetValue()) 
        d = self._tc.GetValue() 
        print 'd', d 
        month = d.GetMonth() 
        month = month+1 
        month = str(month) 
        if len(month)<2: 
            month = '0'+month 
        #val = str(d.GetDay()) + '-'+month + '-'+str(d.GetYear())
        val = str(d.GetYear()) + '-' + month + '-' + str(d.GetDay()) 
        print 'val, self.startValue',val, self.startValue 
        if val != self.startValue: 
            changed = True 
            grid.GetTable().SetValue(row, col, val) # update the table 

        self.startValue = '' 
        #self._tc.SetValue('') 
        return changed 

    def Reset(self): 
        """ 
        Reset the value in the control back to its starting value. 
        *Must Override* 
        """ 
        self._tc.SetValue(self.startValue) 
        #self._tc.SetInsertionPointEnd() 

    def Clone(self): 
        """ 
        Create a new object which is the copy of this one 
        *Must Override* 
        """ 
        return DatePickerCellEditor() 

class TestFrame(wx.Frame): 
    def __init__(self): 
        wx.Frame.__init__(self, None, title="Grid Editor", 
                          size=(640,480)) 

        grid = wx.grid.Grid(self) 
        grid.CreateGrid(50,50) 
        grid.SetDefaultEditor(DatePickerCellEditor()) 


app = wx.PySimpleApp() 
frame = TestFrame() 
frame.Show() 
app.MainLoop() 

 

你可能感兴趣的:(python,grid,Data Picker)