2016-07-07 10 views
0

online tutorialから次のコードを使用して、マウスをクリックすると状態を変更するストップライトを作成してイベントベースのプログラミングを学習します。ここに私のコードの全体です:Python Turtle mainloop()usage

wn.mainloop() 

しかし、私はエラーを取得::

import turtle 

turtle.setup(400,500) 
wn = turtle.Screen() 
wn.title("Tess becomes a traffic light!") 
wn.bgcolor("lightgreen") 
tess = turtle.Turtle() 

def draw_housing(): 
    tess.pensize(3) 
    tess.color("black","darkgrey") 
    tess.begin_fill() 
    tess.forward(80) 
    tess.left(90) 
    tess.forward(200) 
    tess.circle(40, 180) 
    tess.forward(200) 
    tess.left(90) 
    tess.end_fill() 

draw_housing() 

tess.penup() 
tess.forward(40) 
tess.left(90) 
tess.forward(40) 
tess.shape("circle") 
tess.shapesize(3) 
tess.fillcolor("green") 

state_num = 0 

def nextFSMstate(): 
    global state_num 
    if state_num == 0: 
      tess.forward(70) 
      tess.fillcolor("orange") 
      state_num = 1 
    elif state_num == 1: 
      tess.forward(70) 
      tess.fillcolor("red") 
      state_num = 2 
    else: 
      tess.back(140) 
      tess.fillcolor("green") 
      state_num = 0 

wn.onkey(nextFSMstate, "space") 
wn.listen() 
turtle.mainloop() 
    # example says wn.mainloop() but I get error. This works though 

チュートリアルでは、彼らが使用

File "stopLights.py", line 51, in <module> 
    wn.mainloop() 
AttributeError: '_Screen' object has no attribute 'mainloop' 

をして使用する必要が

turtle.mainloop() 

なぜ違いがありますか?私はUbuntuでPython 2.7を使用しています。この例はPyScripterにあります。前もって感謝します。

答えて

2

チュートリアルでエラーが発生しているようです。

オンラインでは、wn = turtle.Screen()が定義されています。つまり、wn.mainloop()の後の呼び出しは、turtle.Screen().mainloop()を呼び出すのと同じ意味です。

これは意味をなさない。エラーメッセージの状態として.mainloop()メソッドがturtle.Screen()でないためです。 ですが、turtleオブジェクトの.mainloop()メソッドです。その理由は、それを呼び出す理由です。

+0

ああ、それをクリアしていただきありがとうございます。 – DDauS

+0

タートルオブジェクトの.mainloop()*メソッド*はありません。turtle.mainloop()は、タートルライブラリを呼び出す*関数です。 Python 2はmainloop()をTK.mainloopの同義語であるトップレベルの関数として定義しています - Python 3はmainloop()をTuk.mainloop()を呼び出すScreenメソッド(TurtleScreen経由、TurtleScreenBase経由)他のScreenメソッドは、唯一のScreenインスタンス上で同じ名前のメソッドを呼び出すトップレベル関数として(プログラムで)定義されています。 Python 2の.mainloop()の使用法はPython 3で動作するはずですが、その逆は呼び出された方法によって異なります。 – cdlane

+0

@cdlane _ >>タートルオブジェクトのmainloop()メソッドはありません - turtle.mainloop()はタートルライブラリへの関数呼び出しです._ これについて詳しく説明できますか?私はすべてのメソッドがオブジェクトに関連付けられた関数だと思った。 – DDauS

1

あなたが使用しているPythonのバージョンが、チュートリアルが書かれているバージョンとは異なることが問題であると思われます。私のシステムのPython 3.5では、turtle.Screenクラスのインスタンスは実際にmainloopメソッドを持っているので、あなたが動作していないと報告したコードはうまくいくでしょう。

間違ったバージョンのPythonを引き続き使用すると、コードに他の問題がある可能性があります(質問に含まれている内容は、Python 2とPython 3の共通サブセットの一部であるようですが、mainloop問題)。新しいPythonプログラマーがPython 3で始めることを強くお勧めします。まだ移植されていないライブラリーを特に使用する必要がある場合は、Python 2に戻って(そしてバージョン間の違いを知ることができます) Python 3は未来であり、ライブラリのサポートはかなり良いです!

+0

意味があります。私は3で始まっていましたが、残念なことに、古いコードで作業する必要があるため、2.7に戻らなければなりませんでした – DDauS