【问题标题】:Variables should be defined but aren't变量应该被定义但不是
【发布时间】:2021-03-26 23:32:31
【问题描述】:

我对 Python 完全陌生,一直在学习教程脚本并对其进行修改,以了解我能做什么,但我遇到了一些麻烦。变量红色和绿色出现未定义,我不确定它们为什么会这样?也不知道这是否是通过按键更改颜色的最佳方法,因此非常感谢任何帮助和改进。

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

【问题讨论】:

  • 它们在哪种情况下“出现未定义”? “但他们应该是?”你为什么这么相信?你写的地方,例如if keyboard.is_pressed('r'),什么时候你希望代码检查'r'键是否被按下?
  • “不知道这是否是通过按键更改颜色的最佳方法” 这对您想要发生的事情的解释不够清楚。你必须仔细考虑逻辑。当您按下该键时究竟应该发生什么 - 这是否会改变先前绘制的椭圆的颜色,或者将来将要绘制的椭圆的颜色,或者只是什么?
  • 这些变量是在类级别定义的——它们在实例方法中作为局部变量不可见。要从实例方法访问它们,请将ClassName. 放在变量前面,即MyPaintWidget.red 或MyPaintWidget.green。
  • 如果您是“完全不熟悉 Python”,那么您不应该尝试制作图形程序。这引入了很多您现在不需要的复杂性和混乱。您应该首先学习一些基础知识。首先寻找一个通用的 Python 教程。你现在找到的东西,可能假设你已经达到了可以自己回答这个问题的水平,或者更好的是一开始就没有遇到问题。
  • 如果一切都失败了,official documentation 包含一个教程。

标签: python variables undefined


【解决方案1】:
if keyboard.is_pressed('r'):
    red = True
    green = False
elif keyboard.is_pressed('g'):
    green = True
    red = False

这部分代码没有在这个类的任何方法中定义。 因此,这些变量永远不会被定义为类体仅在启动时执行,而不是在 main 开始运行后执行,并且您的键盘不会捕捉到稍后被按下的任何键。

red 和 green 不存在,除非有什么东西让代码输入这个 if 或 else 缩进行。因此,如果您尝试在 on_touch 方法中访问它们,肯定会遇到运行时错误。

【讨论】:

    【解决方案2】:

    我不确定是什么在调用on_touch_down(),但你应该移动你的 red/green 设置代码:

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

    进入on_touch_down() 方法的顶部,以便在尝试执行依赖于它们的代码之前调用它。

    【讨论】:

    • 我之前在 on_touch_down() 方法中使用过它并且效果很好,但这意味着我必须在按下键的同时单击以更改颜色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多