在python脚本中,我希望每次单击按钮时计数器都增加。在我当前的代码中,当您单击按钮时,数字不会增加。我在做什么错了?
import direct.directbase.DirectStart
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectGui import *
from panda3d.core import TextNode
clickCount = 0
bk_text = "Times Clicked: " + str(clickCount)
textObject = OnscreenText(text = bk_text, pos = (0.95, -0.95),
scale = 0.07, fg = (1,0.5,0.5,1),
align=TextNode.ACenter, mayChange = 1)
def setText(clickCount):
addClickCount(clickCount)
bk_text = "Times Clicked: " + str(clickCount)
textObject.setText(bk_text)
def addClickCount(clickCount):
clickCount += 1
return clickCount
b = DirectButton(text = ("button"), scale=.05, command=setText(clickCount))
run()
答案 0 :(得分:0)
根据@wwii评论,尝试以下操作:
def setText(clickCount):
newClickCount = addClickCount(clickCount)
bk_text = "Times Clicked: " + str(newClickCount)
textObject.setText(bk_text)
答案 1 :(得分:0)
由于clickCount
是全局变量,所以呢:
import direct.directbase.DirectStart
from direct.gui.OnscreenText import OnscreenText
from direct.gui.DirectGui import *
from panda3d.core import TextNode
clickCount = 0
textObject = OnscreenText(text = bk_text, pos = (0.95, -0.95),
scale = 0.07, fg = (1,0.5,0.5,1),
align=TextNode.ACenter, mayChange = 1)
def setText():
count = addClickCount()
bk_text = "Times Clicked: " + str(count)
textObject.setText(bk_text)
def addClickCount():
global clickCount
clickCount += 1
return clickCount
b = DirectButton(text = ("button"), scale=.05, command=setText())
run()
答案 2 :(得分:0)
在Python中,int
对象是不可变的。这意味着您永远不能就地修改一个,只能重新绑定一个引用一个整数的变量,而不是引用另一个整数。
但是,通常您不能从函数内部重新绑定全局变量。您所做的任何赋值都会创建一个局部变量,而不是重新绑定现有的全局变量(并且您无法读取旧的全局变量,然后在以后绑定具有相同名称的局部变量,如果整个函数的名称范围是局部的,则您曾经绑定过一个值)。
但是,Python提供了global
语句来更改默认范围行为。如果您说global clickCount
,则变量clickCount
将引用函数中所有位置的全局变量。
因此,对您的代码的显而易见的解决方法是,首先删除从函数中传递的参数(这些函数从未做过任何有用的事情),而是使用global
语句:
def setText():
addClickCount()
bk_text = "Times Clicked: " + str(clickCount)
textObject.setText(bk_text)
def addClickCount():
global clickCount
clickCount += 1
b = DirectButton(text = ("button"), scale=.05, command=setText)
addClickCount
函数目前太短了,除非您希望能够单独调用它,否则您可以考虑将其合并到setText
中。