text: from panda3d.core import ModifierButtons
  from direct.showbase.DirectObject import DirectObject
  
  class ArrowKeys(DirectObject):
      UP_INDEX = 0
      DOWN_INDEX = 1
      LEFT_INDEX = 2
      RIGHT_INDEX = 3
      JUMP_INDEX = 4
      NULL_HANDLERS = (None, None, None, None, None)
  
      def __init__(self):
          UP_KEY = base.MOVE_UP
          DOWN_KEY = base.MOVE_DOWN
          LEFT_KEY = base.MOVE_LEFT
          RIGHT_KEY = base.MOVE_RIGHT
          JUMP_KEY = base.JUMP
          self.__jumpPost = 0
          self.setPressHandlers(self.NULL_HANDLERS)
          self.setReleaseHandlers(self.NULL_HANDLERS)
          self.origMb = base.buttonThrowers[0].node().getModifierButtons()
          base.buttonThrowers[0].node().setModifierButtons(ModifierButtons())
          self.enable()
  
      def enable(self):
          self.disable()
          self.accept(self.UP_KEY, self.__upKeyPressed)
          self.accept(self.DOWN_KEY, self.__downKeyPressed)
          self.accept(self.LEFT_KEY, self.__leftKeyPressed)
          self.accept(self.RIGHT_KEY, self.__rightKeyPressed)
          self.accept(self.JUMP_KEY, self.__jumpKeyPressed)
  
      def disable(self):
          self.__upPressed = 0
          self.__downPressed = 0
          self.__leftPressed = 0
          self.__rightPressed = 0
          self.__jumpPressed = 0
          self.ignore(self.UP_KEY)
          self.ignore(self.DOWN_KEY)
          self.ignore(self.LEFT_KEY)
          self.ignore(self.RIGHT_KEY)
          self.ignore(self.JUMP_KEY)
          self.ignore(self.UP_KEY + '-up')
          self.ignore(self.DOWN_KEY + '-up')
          self.ignore(self.LEFT_KEY + '-up')
          self.ignore(self.RIGHT_KEY + '-up')
          self.ignore(self.JUMP_KEY + '-up')
  
      def destroy(self):
          base.buttonThrowers[0].node().setModifierButtons(self.origMb)
          events = [self.UP_KEY,
           self.DOWN_KEY,
           self.LEFT_KEY,
           self.RIGHT_KEY,
           self.JUMP_KEY]
          for event in events:
              self.ignore(event)
              self.ignore(event + '-up')
  
      def upPressed(self):
          return self.__upPressed
  
      def downPressed(self):
          return self.__downPressed
  
      def leftPressed(self):
          return self.__leftPressed
  
      def rightPressed(self):
          return self.__rightPressed
  
      def jumpPressed(self):
          return self.__jumpPressed
  
      def jumpPost(self):
          jumpCache = self.__jumpPost
          self.__jumpPost = 0
          return jumpCache
  
      def setPressHandlers(self, handlers):
          if len(handlers) == 4:
              handlers.append(None)
          self.__checkCallbacks(handlers)
          self.__pressHandlers = handlers
          return
  
      def setReleaseHandlers(self, handlers):
          if len(handlers) == 4:
              handlers.append(None)
          self.__checkCallbacks(handlers)
          self.__releaseHandlers = handlers
          return
  
      def clearPressHandlers(self):
          self.setPressHandlers(self.NULL_HANDLERS)
  
      def clearReleaseHandlers(self):
          self.setReleaseHandlers(self.NULL_HANDLERS)
  
      def __checkCallbacks(self, callbacks):
          for callback in callbacks:
              pass
  
      def __doCallback(self, callback):
          if callback:
              callback()
  
      def __upKeyPressed(self):
          self.ignore(self.UP_KEY)
          self.accept(self.UP_KEY + '-up', self.__upKeyReleased)
          self.__upPressed = 1
          self.__doCallback(self.__pressHandlers[self.UP_INDEX])
  
      def __downKeyPressed(self):
          self.ignore(self.DOWN_KEY)
          self.accept(self.DOWN_KEY + '-up', self.__downKeyReleased)
          self.__downPressed = 1
          self.__doCallback(self.__pressHandlers[self.DOWN_INDEX])
  
      def __leftKeyPressed(self):
          self.ignore(self.LEFT_KEY)
          self.accept(self.LEFT_KEY + '-up', self.__leftKeyReleased)
          self.__leftPressed = 1
          self.__doCallback(self.__pressHandlers[self.LEFT_INDEX])
  
      def __rightKeyPressed(self):
          self.ignore(self.RIGHT_KEY)
          self.accept(self.RIGHT_KEY + '-up', self.__rightKeyReleased)
          self.__rightPressed = 1
          self.__doCallback(self.__pressHandlers[self.RIGHT_INDEX])
  
      def __jumpKeyPressed(self):
          self.ignore(self.JUMP_KEY)
          self.accept(self.JUMP_KEY + '-up', self.__jumpKeyReleased)
          self.__jumpPressed = 1
          self.__jumpPost = 1
          self.__doCallback(self.__pressHandlers[self.JUMP_INDEX])
  
      def __upKeyReleased(self):
          self.ignore(self.UP_KEY + '-up')
          self.accept(self.UP_KEY, self.__upKeyPressed)
          self.__upPressed = 0
          self.__doCallback(self.__releaseHandlers[self.UP_INDEX])
  
      def __downKeyReleased(self):
          self.ignore(self.DOWN_KEY + '-up')
          self.accept(self.DOWN_KEY, self.__downKeyPressed)
          self.__downPressed = 0
          self.__doCallback(self.__releaseHandlers[self.DOWN_INDEX])
  
      def __leftKeyReleased(self):
          self.ignore(self.LEFT_KEY + '-up')
          self.accept(self.LEFT_KEY, self.__leftKeyPressed)
          self.__leftPressed = 0
          self.__doCallback(self.__releaseHandlers[self.LEFT_INDEX])
  
      def __rightKeyReleased(self):
          self.ignore(self.RIGHT_KEY + '-up')
          self.accept(self.RIGHT_KEY, self.__rightKeyPressed)
          self.__rightPressed = 0
          self.__doCallback(self.__releaseHandlers[self.RIGHT_INDEX])
  
      def __jumpKeyReleased(self):
          self.ignore(self.JUMP_KEY + '-up')
          self.accept(self.JUMP_KEY, self.__jumpKeyPressed)
          self.__jumpPressed = 0
          self.__jumpPost = 0
          self.__doCallback(self.__releaseHandlers[self.JUMP_INDEX])
  