2017-02-21 4 views
1

私はkivyのチュートリアルを少しでも練習しています。コードの平和は私のためにはかなり混乱しています。私はこれについて説明したいので、強いコンセプトを構築することができます。Pythonコードのvaiable raiseエラーから自己を削除する理由は何ですか?

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

私の質問は、あなたが、私はコードの一部としてこれらの行を使用した場合の2行がコメントアウトされているコードを見れば、ウィジェットが表示され、私はときに私は問題なく線を描くことができますが、ということですクリアボタンを押すとエラーが発生します。

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

self.painter(前の行を除く)で行を追加してもうまく動作し、キャンバス領域を消去します。

Whay自己の不在時にこの動作を示していますか。しかし、私は自己の使用を理解していますが、この時間コードは私にとってはかなり混乱しています。

+2

'painter'は_function_に対してローカルで、' self.painter'はオブジェクトインスタンスから見ることができます... –

+0

@ Jean-FrançoisFabreFabreはあなたに説明してくれてありがとう、 "self.painter.canvas.clear () "" NameError:グローバル名 'painter'が定義されていません "というエラーが発生しています。つまり、オブジェクトペインタを作成しているときにクラスMyPaintAppの現在のインスタンスを参照しているため、自己なしでは孤立した変数やオブジェクトのように動作します。私が間違っていれば私を修正してください。 – jax

答えて

1

Python selfは、現在のインスタンスを表します。何かを自己に割り当てると、現在のオブジェクトに追加され、他の方法(この場合はclear_canvas)で再利用できます。

selfを省略すると、painter変数はローカル変数であり、オブジェクトに追加されません。 clear_canvasへの呼び出しは、この変数がアクセス可能である必要があるため、例外をスローします。

関連する問題