2013-03-14 53 views
0

这是我的代码,在main方法中,只有一个行:的Panda3D startingwindow作品或者作品不是没有道理的

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 

没有对代码进行任何更改,我有时会得到没有任何按钮,黑色的窗口,一个粉红色的窗口(右结肠r)没有任何按钮或带有全部三个按钮的粉红色窗口。

没有堆栈跟踪,因为编译器从来没有看到错误,所以我想我有一个死锁的地方。 我只是没有找到它,我的意思是,它不是这么多的代码。

任何人都可以帮忙吗?

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

+0

没有堆栈跟踪我不知道在哪里查找 – newnewbie 2013-03-14 22:30:00

+0

我刚试过5次 - ,第五个在粉色屏幕上没有按钮,没有人有想法在哪里寻找错误吗?请... – newnewbie 2013-03-14 22:50:46

回答

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的原因是因为列表是通过引用传递的,而不是按值传递

+0

只有一个问题:myShowBase.run()启动窗口,但它当然不会返回。我怎么可能在开始运行方法后不用线程来填充窗口? – newnewbie 2013-03-16 15:01:14

+0

不要介意我的评论,但是非常感谢你对我采取怜悯和回答,你做了我的一天!!! – newnewbie 2013-03-16 15:05:36

+0

我该怎么做,如果我想要非默认设置的按钮? – newnewbie 2013-03-16 18:26:03