这是我的代码,在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似乎不起作用 - 第一个按钮,如果它出现,总是设置。
答案 0 :(得分:1)
我猜这个问题与你使用线程有关。首先,我建议您使用Panda3D 1.8,如果您还没有使用它,它会改进对线程的支持。也就是说,我仍然可以在Panda3D 1.8中重现您的代码的一些问题。
其次,我强烈建议您在主线程中进行设置,或者添加其他同步。例如,如果在主线程中正确启动窗口之前调用了setBackgroundColor,则窗口可能显示为黑色。使用线程时需要考虑许多潜在的陷阱,特别是在同时从两个线程访问相同的构造时。我会为重载操作保留线程,例如加载模型(Panda3D有异步构造的特殊构造)或者与图形管道几乎没有交互的游戏逻辑。
对于indicatorValue,您需要实际使用value
和variable
字段来更改默认值,如下所示:
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的原因是因为列表是通过引用传递的,而不是通过值传递的。