Pregunta

Recientemente he descargado Kivy como se me ha dado la más comprensible la documentación y los tutoriales, etc.He tratado de pygame y de cocos, pero nunca podría conseguir una fundación, y con Kivy ha sido fácil.

Así que aquí está mi problema, he hecho un juego de pong, y estoy tratando de hacer el juego en pausa por detener el pong, y luego comenzar de nuevo cuando es unpaused (cambiando su velocidad).

Aquí está mi código:

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   

Como se puede ver en los comentarios, Si yo no uso global, I se hace referencia a antes de la asignación de error.Pero es una variable local, no entiendo por qué esto está ocurriendo.

Alguien tiene alguna idea?gracias?

Editar:Sólo para asegurarse de que todo el mundo tiene claro en mis intenciones, yo NO quiero usar un mundial, pero es la única manera de que funcione.Yo preferiría no usar variables globales.

¿Fue útil?

Solución

Si fijas la sangría de error de nuevo verás que: Se puede ver que:

  1. el escape escape debería funcionar sin el mundial, sin embargo tempBallVelocity será considerado como una variable local.Si desea modificar una variable global que necesita para agregar la declaración global de decirle a python que tempBallVelocity no es local, sino global.

  2. En el segundo caso, tempBallVelocity no es localmente inicializado si no se introduce el escape del bloque y por lo tanto no puede ser utilizado como un local R-value.En este caso python debe buscar la variable fuera de la clase.Es tempBallVelocity realmente una variable global ?

comentario:si los casos son exclusivos debe utilizar elif en lugar de if para el segundo caso.

Otros consejos

El código dentro de la función no es sangría, es que sólo un error de copia?Si no me pregunto por qué usted no recibe un mensaje de error.

Editar:Ok, es fácil establecer la variable tempBallVelocity al llamar a la función con 'escape' pero, a continuación, sale de la función y se pierde la variable.Si a continuación, llamar con el "acento grave' no ha configurado la variable tempBallVelocity sin embargo, la mejor solución sería que:self.tempBallVelocity = self.ball.velocity.

Cada vez que se establece una variable dentro de un identated bloque de código, la variable se destruye una vez que usted sale de ese bloque, de nuevo en la anterior identation;

Si usted escribe

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

dentro de un gran script, python se encarga únicamente de la variable foo mientras se está "dentro" de la instrucción if, y una vez que se termina y sale, foo se olvida completamente, con el fin de hacer más rápido las cosas, se entiende que si se establece la variable dentro de una instrucción, se va a utilizar sólo dentro de esa declaración.

Si quería hacer algo como esto

if True:
    foo = 'foo value'

# Right now foo has been trashed

if True:
    print foo
    # Raises an error

Usted tendría que establecer la variable foo fuera el 'si' declaraciones

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'

O también se puede hacer mediante el establecimiento de foo como variable global, por lo que no es destruida una vez que reciba fuera de la '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

Pero que puede ser innecesario y confuso en la mayoría de circunstancias, o incluso problemático si usted comienza a hacer todo lo global, por lo que las variables que sólo vas a usar una vez que se acumulan inútilmente en la memoria del dispositivo durante el programa.

Ahora, estás escribiendo una clase, por lo que la manera correcta de hacer lo que está haciendo sería (desde mi punto de vista) para el almacenamiento de la 'tempBallVelocity' variable en la clase como esta

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   

Parece que no respeta la regla que acabo de decir, pero la cosa es que cuando se escribe 'auto.tempBallVelocity = ...' se storaging la info en el auto, que es el acceso directo a la PongGame objeto que vamos a crear una instancia en orden a ejecutar el juego, en el que se ejecutará el método, por lo que la variable significa el stock que hay cuando salga el método.

Espero que esta respuesta es útil para usted, usted debe conseguir una más sólida de conocimientos sobre python, Aprender Python De La Manera Difícil es un sitio de un libro con una libre versión de html que me fue útil.

Vea usted!:D

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top