私は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自己の不在時にこの動作を示していますか。しかし、私は自己の使用を理解していますが、この時間コードは私にとってはかなり混乱しています。
'painter'は_function_に対してローカルで、' self.painter'はオブジェクトインスタンスから見ることができます... –
@ Jean-FrançoisFabreFabreはあなたに説明してくれてありがとう、 "self.painter.canvas.clear () "" NameError:グローバル名 'painter'が定義されていません "というエラーが発生しています。つまり、オブジェクトペインタを作成しているときにクラスMyPaintAppの現在のインスタンスを参照しているため、自己なしでは孤立した変数やオブジェクトのように動作します。私が間違っていれば私を修正してください。 – jax