我最近下载了 Kivy,因为它为我提供了最易于理解的教程和文档等。我尝试过 pygame 和 cocos,但始终无法获得基础,而使用 Kivy 就很容易了。

所以这是我的问题,我做了一个乒乓球游戏,我试图通过停止乒乓球来暂停游戏,然后在它未暂停时再次启动它(通过改变其速度)。

这是我的代码:

class PongGame(Widget):
   ...

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'escape':
        #Why doesnt it work without global?
        #If I don't use a global i get "tempBallVelocity referenced before assignment
            global tempBallVelocity
            tempBallVelocity = self.ball.velocity
            self.ball.velocity = 0,0


        if keycode[1] == '`':
            #Make the ball go again, thus exiting pause
            #This is where the error occurs if I don't use global
            self.ball.velocity = tempBallVelocity   

正如您在评论中看到的,如果我不使用全局,我会在分配错误之前被引用。但这是一个局部变量,我不明白为什么会发生这种情况。

有人有主意吗?谢谢?

编辑:只是为了确保每个人都清楚我的意图,我不想使用全局,但这是唯一可行的方法。我不想使用全局变量。

有帮助吗?

解决方案

如果您再次修复缩进错误,您将看到:你可以看到:

  1. 逃亡 escape 但是应该在没有全局的情况下工作 tempBallVelocity 将被视为局部变量。如果你想修改一个全局变量,你需要添加全局声明来告诉Python: tempBallVelocity 不是本地的而是全球的。

  2. 在第二种情况下, tempBallVelocity 如果不输入转义块,则不会在本地初始化,因此不能用作本地 R值. 。在这种情况下,python 应该在类之外查找变量。是 tempBallVelocity 真的是全局变量吗?

评论:如果情况是排他性的,您应该使用 elif 代替 if 对于第二种情况。

其他提示

您的函数内的代码没有缩进,这只是一个复制错误吗?如果没有,我想知道为什么你没有收到错误。

编辑:好的,设置变量很容易 tempBallVelocity 当你调用该函数时 'escape' 但随后函数退出并且您丢失了变量。如果您随后用“反引号”调用它,则您还没有设置变量 tempBallVelocity 然而,最好的解决方案可能是:self.tempBallVelocity = self.ball.velocity.

每次设置在标识的代码块内的变量时,一旦离开该块,变量就会被销毁,然后返回到以前的标识;

如果您写入

if True:
    foo = 'foo value, which is a string (?)'
    print foo
.

在一个巨大的脚本里,python只处理foo变量,而它是'内部'的if'语句,一旦结束它并熄灭,Foo被完全忘记,以便更快地制作东西,它可以理解,如果你设置了在语句中的变量,您只能在该语句中使用它。

如果你想做这样的事情

if True:
    foo = 'foo value'

# Right now foo has been trashed

if True:
    print foo
    # Raises an error
.

您必须在“if”语句之外设置foo变量

foo = ''

if True:
    foo = 'foo value'

# Right now foo still exists and keeps it's recently changed value

if True:
    print foo
    # prints 'foo value'
.

或者您也可以通过将foo设置为全局变量来完成它,因此在“如果'语句之外不会被销毁,因此在'if'语句

之外
if True:
    global foo
    foo = 'foo value'

# foo still exists as it's a global variable

if True:
    print foo
    # There's no reason so it wouldn't work
.

但在大多数循环中可能是不必要的,令人困惑的是,如果你开始制作一切全球化的变量,你只能在程序期间只使用一次accrue,你只能在你的设备的内存上使用。

现在你正在写一堂课,所以正确的方法要做你正在做的事情会是(从我的角度来看)将“TempballVelocity”变量存储在课程中,如此

class PongGame(Widget):
   ...

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'escape':
            self.tempBallVelocity = self.ball.velocity
            self.ball.velocity = 0,0


        if keycode[1] == '`':
            self.ball.velocity = self.tempBallVelocity   
. 它看起来它不尊重我刚刚告诉过你的规则,但这就是当你写'self.tempballvelocity= ...'你正在存储自己的信息,这是快捷方式Ponggame对象您将实例化以运行游戏,这将运行该方法,因此在获取方法时,变量将在那里存储。

我希望这个答案对你有所帮助,你应该得到一个更坚实的关于python的知识,学习python很难的方式是一本书的网站,具有免费的HTML版本,对我很有用。

见! :d

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top