【问题标题】:Why doesn't the number increase when the function is called?为什么调用函数时数字不增加?
【发布时间】:2018-07-01 01:45:28
【问题描述】:

在 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()

【问题讨论】:

  • 这是因为您通过复制将其传递给函数,所以addClickCount 中的clickCount 不是全局clickCount
  • 您需要将返回值分配给某个东西,然后使用它 - something = addClickCount(clickCount)。很确定这是重复的...

标签: python function button numbers int


【解决方案1】:

根据@wwii 评论,试试这个:

def setText(clickCount):

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

【讨论】:

    【解决方案2】:

    在 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 中,除非您希望能够单独调用它。

    【讨论】:

      【解决方案3】:

      既然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()
      

      【讨论】:

      • 如果没有global 语句,您将无法在函数中重新绑定全局变量。此外,您不想在创建按钮时调用setText()(带括号),只需传递对函数的引用而不调用它。
      猜你喜欢
      • 2023-01-22
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      相关资源
      最近更新 更多