Panda3d startwindow的工作或工作并非没有道理

时间:2013-03-14 22:09:56

标签: python panda3d

这是我的代码,在main方法中,只有一行:

game.initShowBase()

此功能的代码是:

def initShowBase():

   global myShowBase   
   myShowBase = ShowBase(False)
   startwindowThread = threading.Thread(target = starters.startfunction)
   startwindowThread.start()
   myShowBase.run()
然后是

启动者:

def startfunction():
   from modules.logic import game
   global h
   h = 0
   print h
   # g1 = open ("game1", "a")
   #g1.close()
   #g2 = open ("game2", "a")
   #g2.close()
   #g3 = open ("game3", "a")
   #g3.close()
   game.myShowBase.setBackgroundColor(1.0,0.627,0.894, 1)     
   textObject = OnscreenText(text = "Beginn", pos = (0.95,-0.95), 
                         scale = 0.07,fg=(1,0.5,0.5,1),align=TextNode.ACenter,mayChange=1)


   buttons = [
           DirectRadioButton(text = 'Game 1 ', scale=0.05, indicatorValue = 0,  pos=(-0.4,0,0), command=load, extraArgs =[1]),
           DirectRadioButton(text = 'Game 2 ',  scale=0.05, indicatorValue = 0, pos=(0,0,0), command=load, extraArgs = [2]),
           DirectRadioButton(text = 'Game 3 ',  scale=0.05, indicatorValue = 0, pos=(0.4,0,0), command=load, extraArgs = [3])
         ]
   print "button"
   for button in buttons:
       button.setOthers(buttons)
       print "true"


def load(gamenumber):
   global h
   if (gamenumber==1):
       h += 1
       if (h>0):
           loadGame("game1")
   elif (gamenumber==2):
       loadGame("game2")
   else:
       loadGame("game3")


def loadGame (gamename): 
    from modules.logic import game
    global data
    data = open (gamename, "r")
    print gamename

如果没有对代码进行任何更改,我有时会得到一个没有任何按钮的黑色窗口,一个没有任何按钮的粉红色窗口(右侧颜色)或一个带有所有三个按钮的粉红色窗口。

没有堆栈跟踪,因为编译器似乎永远不会看到错误,所以我想我在某个地方遇到了死锁。 我只是找不到它,我的意思是,这不是很多代码。

任何人都可以帮忙吗?

也许我还应该提一下,indicatorValue似乎不起作用 - 第一个按钮,如果它出现,总是设置。

1 个答案:

答案 0 :(得分:1)

我猜这个问题与你使用线程有关。首先,我建议您使用Panda3D 1.8,如果您还没有使用它,它会改进对线程的支持。也就是说,我仍然可以在Panda3D 1.8中重现您的代码的一些问题。

其次,我强烈建议您在主线程中进行设置,或者添加其他同步。例如,如果在主线程中正确启动窗口之前调用了setBackgroundColor,则窗口可能显示为黑色。使用线程时需要考虑许多潜在的陷阱,特别是在同时从两个线程访问相同的构造时。我会为重载操作保留线程,例如加载模型(Panda3D有异步构造的特殊构造)或者与图形管道几乎没有交互的游戏逻辑。

对于indicatorValue,您需要实际使用valuevariable字段来更改默认值,如下所示:

var = [1]
buttons = [
    DirectRadioButton(text='Game 1 ', variable=var, value=[1], scale=0.05, pos=(-0.4,0,0), command=load, extraArgs=[1]),
    DirectRadioButton(text='Game 2 ', variable=var, value=[2], scale=0.05, pos=(0,0,0), command=load, extraArgs=[2]),
    DirectRadioButton(text='Game 3 ', variable=var, value=[3], scale=0.05, pos=(0.4,0,0), command=load, extraArgs=[3])
]

默认情况下,将选择与var中设置的值匹配的按钮值。 (使用列表而不是int的原因是因为列表是通过引用传递的,而不是通过值传递的。