从python代码中的可变引发错误中删除self,为什么?

时间:2017-02-21 10:10:07

标签: python kivy

我正在练习一些kivy教程,代码的安静对我来说很混乱,我只是想要一个解释,以便我可以建立强大的概念。

from random import random 
from kivy.app import App
from kivy.uix.widget import Widget 
from kivy.uix.button import Button 
from kivy.graphics import Color, Ellipse, Line

class MyPaintWidget(Widget):
    def on_touch_down(self, touch):
        color = (random(), 1,1)
        with self.canvas:
            Color(*color, made='hsv')
            d = 30.
            Ellipse(pos=(touch.x-d/2, touch.y-d/2),size=(d,d))
            touch.ud['line']= Line(points=(touch.x, touch.y))

    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]

class MyPaintApp(App):
    def build(self):
        parent = Widget()
        self.painter = MyPaintWidget()
        #painter = MyPaintWidget()
        clearbtn = Button(text="Clear")
        clearbtn.bind(on_release=self.clear_canvas)
        parent.add_widget(self.painter)
        #parent.add_widget(painter)

        parent.add_widget(clearbtn)
        return parent

    def clear_canvas(self, obj):
        self.painter.canvas.clear()
if __name__=="__main__":
    MyPaintApp().run()

我的问题是,如果你查看代码,当我使用这些行作为代码的一部分时,两行被注释掉了,小部件出现了,我可以绘制线条而没有任何问题但是当我按下清除按钮时它引发了一个错误。

"AttributeError: 'MyPaintApp' object has no attribute 'painter'" 

使用self.painter(不包括前面的行)添加该行时,可以正常工作并清除画布区域。

在没有自我的情况下,它会显示出这种行为。虽然,我理解自我的使用,但这次代码对我来说相当混乱。

1 个答案:

答案 0 :(得分:1)

在Python中self代表当前实例。如果您为self指定了某些内容,它将被添加到当前对象中,并且可以被其他方法重用(在这种情况下:clear_canvas)。

如果省略self,则painter变量是局部变量,不会添加到对象中。调用clear_canvas会抛出异常,因为它需要可以访问此变量。