Search code examples
pythonwxpythonwxgrid

Setting focus to cell wxGrid


How can I set focus to specific cell in wxGrid? For example, I catch enter pressed event in one cell, and I want to gain focus to cell which is on the right to that one. Default behavior is to gain focus to cell below when enter is pressed.


Solution

  • The wxpython demo shows you how to do this

    import  wx
    import  wx.grid as  gridlib
    
    #---------------------------------------------------------------------------
    
    class NewEnterHandlingGrid(gridlib.Grid):
        def __init__(self, parent, log):
            gridlib.Grid.__init__(self, parent, -1)
            self.log = log
    
            self.CreateGrid(20, 6)
    
            self.SetCellValue(0, 0, "Enter moves to the right")
            self.SetCellValue(0, 5, "Enter wraps to next row")
            self.SetColSize(0, 150)
            self.SetColSize(5, 150)
    
            self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
    
    
        def OnKeyDown(self, evt):
            if evt.GetKeyCode() != wx.WXK_RETURN:
                evt.Skip()
                return
    
            if evt.ControlDown():   # the edit control needs this key
                evt.Skip()
                return
    
            self.DisableCellEditControl()
            success = self.MoveCursorRight(evt.ShiftDown())
    
            if not success:
                newRow = self.GetGridCursorRow() + 1
    
                if newRow < self.GetTable().GetNumberRows():
                    self.SetGridCursor(newRow, 0)
                    self.MakeCellVisible(newRow, 0)
                else:
                    # this would be a good place to add a new row if your app
                    # needs to do that
                    pass
    
    
    #---------------------------------------------------------------------------
    
    class TestFrame(wx.Frame):
        def __init__(self, parent, log):
            wx.Frame.__init__(self, parent, -1, "Simple Grid Demo", size=(640,480))
            grid = NewEnterHandlingGrid(self, log)
    
    
    
    #---------------------------------------------------------------------------
    
    if __name__ == '__main__':
        import sys
        app = wx.App()
        frame = TestFrame(None, sys.stdout)
        frame.Show(True)
        app.MainLoop()
    
    
    #---------------------------------------------------------------------------