Main menu issue

I made this script. When I click down it goes to the next word.(makes it black) The problem is it only lets me go down one word before it stops working. I guess I don’t understand tasks a lot. :cry:

import direct.directbase.DirectStart
from pandac.PandaModules import *
from direct.showbase.DirectObject import DirectObject
from direct.gui.OnscreenText import OnscreenText
from direct.gui.OnscreenImage import OnscreenImage
from pandac.PandaModules import TransparencyAttrib
from direct.task import Task
from direct.fsm import FSM


import sys, os

class world(FSM.FSM, DirectObject):
	
	def __init__(self):
		
		wp = WindowProperties()
		wp.setTitle('Talking Guy')
		#wp.setSize('640,480')
		base.win.requestProperties(wp)
		
		self.image = OnscreenImage(image = 'title.png', pos = (0, 0, 0), scale = (1.5, 1, 1))
		self.image.setTransparency(TransparencyAttrib.MAlpha)
		
		FSM.FSM.__init__(self,'avatarFSM') 
		
		print base.win.getXSize
		print base.win.getYSize
		
		self.textMode = None
		self.action = None
		
		self.play = OnscreenText(text="Play Game",
			style=1, fg=(0,0,0,1),
			pos=(-1,0), scale = .1)
			
		self.htp = OnscreenText(text="How to play",
			style=1, fg=(1,1,1,1),
			pos=(-1,-.3), scale = .1)
			
		self.extra = OnscreenText(text="Extra info.",
			style=1, fg=(1,1,1,1),
			pos=(-1,-.6), scale = .1)
			
		self.accept("escape", sys.exit)
		self.accept("arrow_down",self.setAction, extraArgs=['down'])
		self.accept("arrow_up",self.setAction, extraArgs=['up'])
		
		taskMgr.add(self.setText, "Menu") 
		
		
	def setAction(self, action=None):
	
		self.textMode = action
	
	def setText(self, task):
		
		self.mode = 'play'
		
		if self.textMode:
			
			if self.textMode == 'down' and  self.mode == 'play':
				
				self.play.destroy()
				self.play = OnscreenText(text="Play Game",
					style=1, fg=(1,1,1,1),
					pos=(-1,0), scale = .1)
				self.htp.destroy()
				self.htp = OnscreenText(text="How to play",
					style=1, fg=(0,0,0,1),
					pos=(-1,-.3), scale = .1)
				self.mode = 'htp'
				return task.cont
				
			elif self.textMode == 'down' and self.mode == 'htp':
				
				self.htp.destroy()
				self.htp = OnscreenText(text="How to play",
					style=1, fg=(1,1,1,1),
					pos=(-1,-.3), scale = .1)
				self.extra.destroy()
				self.extra = OnscreenText(text="Extra info.",
					style=1, fg=(0,0,0,1),
					pos=(-1,-.6), scale = .1)
				return task.cont
				
				
		return task.cont
		
		
w = world()

run()

Thanks for taking the time to read this and Im pretty sure the error is pretty easy.

your code doesnt really make sense. you have a task (a task is called every frame) which changes the selection according to the last key you pressed, however you do not handle every possible case that can occur.

this is more like you want it to work, however it’s not handling the up-keys. also you could just change the color of the onscreentext’s, not destroying/creating them on every keypress:

import direct.directbase.DirectStart
from pandac.PandaModules import *
from direct.showbase.DirectObject import DirectObject
from direct.gui.OnscreenText import OnscreenText
from direct.gui.OnscreenImage import OnscreenImage
from pandac.PandaModules import TransparencyAttrib
from direct.task import Task
from direct.fsm import FSM


import sys, os

class world(FSM.FSM, DirectObject):
   
   def __init__(self):
      
      wp = WindowProperties()
      wp.setTitle('Talking Guy')
      #wp.setSize('640,480')
      base.win.requestProperties(wp)
      
      self.image = OnscreenImage(image = 'title.png', pos = (0, 0, 0), scale = (1.5, 1, 1))
      self.image.setTransparency(TransparencyAttrib.MAlpha)
      
      FSM.FSM.__init__(self,'avatarFSM')
      
      print base.win.getXSize
      print base.win.getYSize
      
      self.textMode = None
      self.action = None
      
      self.play = OnscreenText(text="Play Game",
         style=1, fg=(0,0,0,1),
         pos=(-1,0), scale = .1)
         
      self.htp = OnscreenText(text="How to play",
         style=1, fg=(1,1,1,1),
         pos=(-1,-.3), scale = .1)
         
      self.extra = OnscreenText(text="Extra info.",
         style=1, fg=(1,1,1,1),
         pos=(-1,-.6), scale = .1)
         
      self.accept("escape", sys.exit)
      self.accept("arrow_down",self.setAction, extraArgs=['down'])
      self.accept("arrow_up",self.setAction, extraArgs=['up'])
      
      self.mode = 'play'
      
      
   def setAction(self, action=None):
   
      self.textMode = action
      if self.textMode:
         
         if self.textMode == 'down' and  self.mode == 'play':
            self.play.destroy()
            self.play = OnscreenText(text="Play Game",
               style=1, fg=(1,1,1,1),
               pos=(-1,0), scale = .1)
            self.htp.destroy()
            self.htp = OnscreenText(text="How to play",
               style=1, fg=(0,0,0,1),
               pos=(-1,-.3), scale = .1)
            self.mode = 'htp'
            
         elif self.textMode == 'down' and self.mode == 'htp':
            self.htp.destroy()
            self.htp = OnscreenText(text="How to play",
               style=1, fg=(1,1,1,1),
               pos=(-1,-.3), scale = .1)
            self.extra.destroy()
            self.extra = OnscreenText(text="Extra info.",
               style=1, fg=(0,0,0,1),
               pos=(-1,-.6), scale = .1)
            self.mode = 'extra'
            
         elif self.textMode == 'down' and self.mode == 'extra':
            self.extra.destroy()
            self.extra = OnscreenText(text="Extra info.",
               style=1, fg=(1,1,1,1),
               pos=(-1,-.6), scale = .1)
            self.play.destroy()
            self.play = OnscreenText(text="Play Game",
               style=1, fg=(0,0,0,1),
               pos=(-1,0), scale = .1)
            self.mode = 'play'
            
      
      
w = world()

run()

also you are inheriting from finite state machine, but you are not using it.