Почему число не увеличивается при вызове функции? - PullRequest
0 голосов
/ 01 июля 2018

В скрипте 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()

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

Поскольку 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()
0 голосов
/ 01 июля 2018

В 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, если только вы не хотите вызывать ее отдельно.

0 голосов
/ 01 июля 2018

В соответствии с комментарием @wwii, попробуйте это:

def setText(clickCount):

newClickCount = addClickCount(clickCount)
bk_text = "Times Clicked: " + str(newClickCount)
textObject.setText(bk_text)
...