problems with picking objects

here is my code

import direct.directbase.DirectStart
from pandac.PandaModules import *
from direct.interval.IntervalGlobal import *
from direct.gui.DirectGui import *

#This is derived from the mathmatical of a plane, solved for a given point
def PointAtZ(z, point, vec):
return point + vec * ((z-point.getZ()) / vec.getZ())

class World (DirectObject):
def init(self):

base.disableMouse()
base.camera.setPos(0,-30,20)
base.camera.setHpr(0,-30,0)

self.fundo = loader.loadModel("models/environment")
self.fundo.reparentTo(render)
self.fundo.setScale(0.25,0.25,0.25)
self.fundo.setPos(-8,42,0)


#criando as colisoes necessárias
self.picker = CollisionTraverser()
self.pq = CollisionHandlerQueue()
    
#criando colisoes do raio do mouse
self.pickerNode = CollisionNode('mouseray')
self.pickerNP = camera.attachNewNode(self.pickerNode)
self.pickerNode.setFromCollideMask(BitMask32.bit(1))

self.pickerRay = CollisionRay()
self.pickerNode.addSolid(self.pickerRay)

#adicionando traverser
self.picker.addCollider(self.pickerNode, self.pq)
self.picker.showCollisions(render)

#carregando modelo
self.bola = loader.loadModel("models/smiley")
self.bola.reparentTo(render)
self.bola.setPos(0,0,1)

self.jack = loader.loadModel('models/jack')
self.jack.reparentTo(render)
self.jack.setPos(2,0,1)
self.jack.setHpr(180,0,0)

#criando a colisão
self.bolaNode = CollisionNode('bola')
self.bolaNode.addSolid(CollisionSphere(0,0,0,1.1))
self.bolaNP = self.bola.attachNewNode(self.bolaNode)
self.bolaNP.show()


self.bola.node().setIntoCollideMask(BitMask32.bit(1))
self.bola.node().setTag('bolinha','1')

self.jackNode = CollisionNode('jack')
self.jackNode.addSolid(CollisionSphere(0,0,0,1.1))
self.jackNP = self.jack.attachNewNode(self.jackNode)
self.jackNP.show()

self.jack.node().setIntoCollideMask(BitMask32.bit(1))
self.jack.node().setTag('bolinha', '2')

#ver se ja tem algo clicado
self.dragging = False

self.pickedObj = False

#criando task e handlers
self.mouseTask = taskMgr.add(self.mouseTask, 'mouseTask')
self.accept("escape",    sys.exit)
self.accept("mouse1",    self.pega)
self.accept("mouse1-up", self.solta)

#fim do init

def mouseTask(self,task):
self.pickedObj = False

#ver se o mouse está disponível
if base.mouseWatcherNode.hasMouse():
mpos = base.mouseWatcherNode.getMouse()
#dar a posição do raio de colisao de acordo com a posição do mouse
self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())



#mudar a posição do objeto clicado
if self.dragging is not False:        
  nearPoint = render.getRelativePoint(camera, self.pickerRay.getOrigin())
  nearVec = render.getRelativeVector(camera, self.pickerRay.getDirection())
  self.i.setPos(PointAtZ(.9, nearPoint, nearVec))

#fazer a colisao
self.picker.traverse(render)
if self.pq.getNumEntries() > 0:
  self.pq.sortEntries()
  self.pickedObj= self.pq.getEntry(0).getIntoNodePath()

  self.i = self.pickedObj.getParent()	  
  
  
return Task.cont

#fim do task

def pega(self):
if (self.pickedObj is not False and self.i):
self.dragging = self.i

def solta(self):
self.dragging = False

w= World()
run()