"James" <c0******@gmail .com> a écrit dans le message de
news:42******** **@news.tm.net. my...
wxpython 2.5.3
anyone know how to make a multiline cell editor for wxgrid?
Hello,
You can do that by a "wxGridCellAuto WrapStringEdito r".
You can test it by modifying GridSimple.py in the demo by adding (at line 24
in my version):
self.SetRowSize (1, 45)
self.SetCellEdi tor(1, 1, wxGridCellAutoW rapStringEditor ())
Save it and now, when you launch the gridsimple in the demo (it's in core
windows control), you can enter multiple lines in the cell containing
"Another cell". It works in 2.4.2.4. I think it should also in 2.5.
I join the whole program.
Have fun.
++jm
#---------------------------------------------------------------
from wxPython.wx import *
from wxPython.grid import *
from wxPython.lib.mi xins.grid import wxGridAutoEditM ixin
#---------------------------------------------------------------------------
class SimpleGrid(wxGr id): ##, wxGridAutoEditM ixin):
def __init__(self, parent, log):
wxGrid.__init__ (self, parent, -1)
##wxGridAutoEdi tMixin.__init__ (self)
self.log = log
self.moveTo = None
EVT_IDLE(self, self.OnIdle)
self.CreateGrid (25, 25) #, wxGrid.wxGridSe lectRows)
##self.EnableEd iting(False)
# simple cell formatting
self.SetColSize (3, 200)
self.SetRowSize (4, 45)
self.SetCellVal ue(0, 0, "First cell")
self.SetCellVal ue(1, 1, "Another cell")
self.SetRowSize (1, 45)
self.SetCellEdi tor(1, 1, wxGridCellAutoW rapStringEditor ())
self.SetCellVal ue(2, 2, "Yet another cell")
self.SetCellVal ue(3, 3, "This cell is read-only")
self.SetCellFon t(0, 0, wxFont(12, wxROMAN, wxITALIC, wxNORMAL))
self.SetCellTex tColour(1, 1, wxRED)
self.SetCellBac kgroundColour(2 , 2, wxCYAN)
self.SetReadOnl y(3, 3, True)
self.SetCellEdi tor(5, 0, wxGridCellNumbe rEditor(1,1000) )
self.SetCellVal ue(5, 0, "123")
self.SetCellEdi tor(6, 0, wxGridCellFloat Editor())
self.SetCellVal ue(6, 0, "123.34")
self.SetCellEdi tor(7, 0, wxGridCellNumbe rEditor())
self.SetCellVal ue(6, 3, "You can veto editing this cell")
# attribute objects let you keep a set of formatting values
# in one spot, and reuse them if needed
attr = wxGridCellAttr( )
attr.SetTextCol our(wxBLACK)
attr.SetBackgro undColour(wxRED )
attr.SetFont(wx Font(10, wxSWISS, wxNORMAL, wxBOLD))
# you can set cell attributes for the whole row (or column)
self.SetRowAttr (5, attr)
self.SetColLabe lValue(0, "Custom")
self.SetColLabe lValue(1, "column")
self.SetColLabe lValue(2, "labels")
self.SetColLabe lAlignment(wxAL IGN_LEFT, wxALIGN_BOTTOM)
#self.SetDefaul tCellOverflow(F alse)
#r = wxGridCellAutoW rapStringRender er()
#self.SetCellRe nderer(9, 1, r)
# overflow cells
self.SetCellVal ue( 9, 1, "This default cell will overflow into
neighboring cells, but not if you turn overflow off.");
self.SetCellSiz e(11, 1, 3, 3);
self.SetCellAli gnment(11, 1, wxALIGN_CENTRE, wxALIGN_CENTRE) ;
self.SetCellVal ue(11, 1, "This cell is set to span 3 rows and 3
columns");
editor = wxGridCellTextE ditor()
editor.SetParam eters('10')
self.SetCellEdi tor(0, 4, editor)
self.SetCellVal ue(0, 4, "Limited text")
# test all the events
EVT_GRID_CELL_L EFT_CLICK(self, self.OnCellLeft Click)
EVT_GRID_CELL_R IGHT_CLICK(self , self.OnCellRigh tClick)
EVT_GRID_CELL_L EFT_DCLICK(self , self.OnCellLeft DClick)
EVT_GRID_CELL_R IGHT_DCLICK(sel f, self.OnCellRigh tDClick)
EVT_GRID_LABEL_ LEFT_CLICK(self , self.OnLabelLef tClick)
EVT_GRID_LABEL_ RIGHT_CLICK(sel f, self.OnLabelRig htClick)
EVT_GRID_LABEL_ LEFT_DCLICK(sel f, self.OnLabelLef tDClick)
EVT_GRID_LABEL_ RIGHT_DCLICK(se lf, self.OnLabelRig htDClick)
EVT_GRID_ROW_SI ZE(self, self.OnRowSize)
EVT_GRID_COL_SI ZE(self, self.OnColSize)
EVT_GRID_RANGE_ SELECT(self, self.OnRangeSel ect)
EVT_GRID_CELL_C HANGE(self, self.OnCellChan ge)
EVT_GRID_SELECT _CELL(self, self.OnSelectCe ll)
EVT_GRID_EDITOR _SHOWN(self, self.OnEditorSh own)
EVT_GRID_EDITOR _HIDDEN(self, self.OnEditorHi dden)
EVT_GRID_EDITOR _CREATED(self, self.OnEditorCr eated)
def OnCellLeftClick (self, evt):
self.log.write( "OnCellLeftClic k: (%d,%d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetPosition ()))
evt.Skip()
def OnCellRightClic k(self, evt):
self.log.write( "OnCellRightCli ck: (%d,%d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetPosition ()))
evt.Skip()
def OnCellLeftDClic k(self, evt):
self.log.write( "OnCellLeftDCli ck: (%d,%d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetPosition ()))
evt.Skip()
def OnCellRightDCli ck(self, evt):
self.log.write( "OnCellRightDCl ick: (%d,%d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetPosition ()))
evt.Skip()
def OnLabelLeftClic k(self, evt):
self.log.write( "OnLabelLeftCli ck: (%d,%d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetPosition ()))
evt.Skip()
def OnLabelRightCli ck(self, evt):
self.log.write( "OnLabelRightCl ick: (%d,%d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetPosition ()))
evt.Skip()
def OnLabelLeftDCli ck(self, evt):
self.log.write( "OnLabelLeftDCl ick: (%d,%d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetPosition ()))
evt.Skip()
def OnLabelRightDCl ick(self, evt):
self.log.write( "OnLabelRightDC lick: (%d,%d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetPosition ()))
evt.Skip()
def OnRowSize(self, evt):
self.log.write( "OnRowSize: row %d, %s\n" %
(evt.GetRowOrCo l(), evt.GetPosition ()))
evt.Skip()
def OnColSize(self, evt):
self.log.write( "OnColSize: col %d, %s\n" %
(evt.GetRowOrCo l(), evt.GetPosition ()))
evt.Skip()
def OnRangeSelect(s elf, evt):
if evt.Selecting() :
self.log.write( "OnRangeSel ect: top-left %s, bottom-right %s\n" %
(evt.GetTopLeft Coords(),
evt.GetBottomRi ghtCoords()))
evt.Skip()
def OnCellChange(se lf, evt):
self.log.write( "OnCellChan ge: (%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.GetCellVal ue(evt.GetRow() , evt.GetCol())
if value == 'no good':
self.moveTo = evt.GetRow(), evt.GetCol()
def OnIdle(self, evt):
if self.moveTo != None:
self.SetGridCur sor(self.moveTo[0], self.moveTo[1])
self.moveTo = None
evt.Skip()
def OnSelectCell(se lf, evt):
self.log.write( "OnSelectCe ll: (%d,%d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetPosition ()))
# Another way to stay in a cell that has a bad value...
row = self.GetGridCur sorRow()
col = self.GetGridCur sorCol()
if self.IsCellEdit ControlEnabled( ):
self.HideCellEd itControl()
self.DisableCel lEditControl()
value = self.GetCellVal ue(row, col)
if value == 'no good 2':
return # cancels the cell selection
evt.Skip()
def OnEditorShown(s elf, evt):
if evt.GetRow() == 6 and evt.GetCol() == 3 and \
wxMessageBox("A re you sure you wish to edit this cell?",
"Checking", wxYES_NO) == wxNO:
evt.Veto()
return
self.log.write( "OnEditorSh own: (%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 \
wxMessageBox("A re you sure you wish to finish editing this
cell?",
"Checking", wxYES_NO) == wxNO:
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( "OnEditorCreate d: (%d, %d) %s\n" %
(evt.GetRow(), evt.GetCol(), evt.GetControl( )))
#---------------------------------------------------------------------------
class TestFrame(wxFra me):
def __init__(self, parent, log):
wxFrame.__init_ _(self, parent, -1, "Simple Grid Demo",
size=(640,480))
grid = SimpleGrid(self , log)
#---------------------------------------------------------------------------
if __name__ == '__main__':
import sys
app = wxPySimpleApp()
frame = TestFrame(None, sys.stdout)
frame.Show(True )
app.MainLoop()
#---------------------------------------------------------------------------