Python: las variables deben definirse pero no lo están

CorePress2024-01-24  9

Soy completamente nuevo en Python y he estado tomando scripts de tutoriales y probando con ellos para ver qué puedo hacer, pero estoy teniendo algunos problemas. Las variables rojo y verde aparecen como indefinidas y no estoy seguro de por qué lo serían. Tampoco sé si esta es la mejor manera de cambiar un color al presionar una tecla, por lo que cualquier ayuda y mejora sería muy apreciada.

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse
import keyboard


class MyPaintWidget(Widget):
    if keyboard.is_pressed('r'):
        red = True
        green = False
    elif keyboard.is_pressed('g'):
        green = True
        red = False
    def on_touch_down(self, touch):
        with self.canvas:
            if red == True:
               Color(1, 0, 0)
            elif green == True:
                Color(0,1,0)
            d = 30.
            Ellipse(pos=(touch.x - d / 2, touch.y - d / 2), size=(d, d))


class MyPaintApp(App):

    def build(self):
        return MyPaintWidget()


if __name__ == '__main__':
    MyPaintApp().run()

1

Aparecen como indefinidos. ¿en qué contexto? "¿Pero deberían serlo?" ¿Por qué crees eso? Donde túHa escrito, por ejemplo, si teclado.is_pressed('r'), ¿cuándo espera que el código verifique si la función 'r' ¿Se presiona la tecla?

- Karl Knechtel

26/03/2021 a las 23:35

"No sé si esta es la mejor manera de cambiar un color al presionar una tecla" Esta no es una explicación lo suficientemente clara de lo que quieres que suceda. Tienes que pensar en la lógica. ¿Qué debería suceder exactamente cuando presionas la tecla? ¿Eso cambia el color del dibujo previamente?elipses, o de las que se dibujarán en el futuro, ¿o simplemente qué?

- Karl Knechtel

26/03/2021 a las 23:38

1

Esas variables se definen a nivel de clase; no son visibles como variables locales en los métodos de instancia. Para acceder a ellos desde un método de instancia, coloque ClassName. delante de la variable, es decir, MyPaintWidget.red o MyPaintWidget.green.

- John Gordon

26/03/2021 a las 23:39

1

Si eres "completamente nuevo en Python" entonces no deberías intentar crear programas gráficos. Esto introduce mucha complejidad y confusión que no es necesaria en este momento. Hay fundamentos que debes aprender primero. Busque primero un tutorial general de Python. Lo que estás encontrando ahora probablemente supone que ya estás en un nivel en el que podrías responder esta pregunta tú mismo, o mejor aún, no encontrarte con el problema en primer lugar.

- Karl Knechtel

26 de marzo de 2021 a las 23:39

1

Si todo lo demás falla, la documentación oficial incluye un tutorial.

- Karl Knechtel

26/03/2021 a las 23:41



------------------------------------

if keyboard.is_pressed('r'):
    red = True
    green = False
elif keyboard.is_pressed('g'):
    green = True
    red = False

Esta sección de código no está definida en ningún método de esta clase. Por lo tanto, estas variables nunca se definirán ya que el cuerpo de la clase se ejecuta solo al inicio, no después de que main comience a ejecutarse, y su teclado no detectará ninguna tecla que se esté ejecutando.se analizará más adelante.

El rojo y el verde no existen a menos que algo haga que el código ingrese esto o líneas sangradas. Así que seguramente obtendrás errores de tiempo de ejecución si intentas acceder a ellos en el método on_touch.



------------------------------------

No estoy seguro de qué es lo que llama a on_touch_down(), pero deberías mover tu código de configuración rojo/verde:

if keyboard.is_pressed('r'):
        red = True
        green = False
    elif keyboard.is_pressed('g'):
        green = True
        red = False

en la parte superior del método on_touch_down() para que sea llamado antes de intentar ejecutar el código que depende de ellos.

respondió

mamá26 de enero de 2021 a las 23:41

HHoverton

HHoverton

1

1

Lo tenía en el método on_touch_down() antes y funcionó, pero significaba que tenía que hacer clic mientras presionaba la tecla para cambiar el color.

- jh123

26/03/2021 a las 23:46

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare