2017-10-08 7 views
0

私はこのコードを実行するとPythonのカメのエラー - コンピュータ・サイエンティストのように考える方法からのコードは:Pythonので学ぶ3

import turtle 
import time 

def show_poly(): 
    try: 
     win = turtle.Screen() 
     tess = turtle.Turtle() 
     n = int(input("How many sides do you want in your polygon?")) 
     angle = 360/n 
     for i in range(n): 
      tess.forward(10) 
      tess.left(angle) 
     time.sleep(3) 
    finally: 
     win.bye() 

show_poly() 
show_poly() 
show_poly() 

は、私はこのエラーを取得するよりも、適切に最初の呼び出しの仕事を得る

トレースバック(最新の呼び出しの最後):show_polyで ファイル "/home/turte.py"、ライン19、show_polyで ()

ファイル "/home/turte.py"、8行目、 テス= turtle.Turtle()

ファイル "/usr/lib/python3.5/turtle.py"、ライン3816、INIT 可視=可視で)

ファイル「の/ usr/libに_update 自己中/usr/lib/python3.5/turtle.py "ライン2660「のinit self._update()

ファイルでは、行2557、" /python3.5/turtle.py、 ._update_data()

ファイル "/usr/lib/python3.5/tu _incrementudc

でターミネーターのカメを上げる/usr/lib/python3.5/turtle.py "ライン1292、「_update_data self.screen._incrementudc()

ファイルでは、行2646、" rtle.py .Terminator

私が問題を理解していれば、最後に閉じても新しい画面を作成できません。 Pythonを実行しました。

+0

の両方に対応する必要がありますSyntaxError'はこちらです。 – Goyo

+0

申し訳ありませんインデントエラーでした。さらに、Python3.4で動作します – Magal

答えて

1

turtle.Screen()によって返されるオブジェクトは、シングルトンになるように意図されているため、コードは積極的にモジュールデザインと戦っています。 the docsにお申し込みの場合は、アプリケーションでRawTurtleのインスタンスを使用する必要があります。

import turtle 
import time 
import tkinter as tk 


def show_poly(): 
    try: 
     n = int(input("How many sides do you want in your polygon?")) 
     angle = 360/n 
     root = tk.Tk() 
     canvas = turtle.ScrolledCanvas(root) 
     canvas.pack(expand=True, fill='both') 
     tess = turtle.RawTurtle(canvas) 
     for i in range(n): 
      tess.forward(10) 
      tess.left(angle) 
     time.sleep(3) 
    finally: 
     root.destroy() 


show_poly() 
show_poly() 
show_poly() 
+0

説明ありがとうございます。私は文書からシングルトンのものを読みましたが、「コンピュータのように考える方法」でこのコードを見つけたので、 科学者:Python 3で学ぶ」実際に問題がどこにあるのか分かりませんでした。 さらに、Python 3.4でも動作しますが、3.5や2.7では動作しません。 – Magal

+0

それは作者の間違った選択でした。 'Screen()'の戻り値がシングルトンの場合、 '.bye()'が定義されていない場合の動作を考慮します。偶然にもうまくいくかもしれませんが、それに頼るべきではありません。私は最近のリリースで 'tkinter'が少し疎外されていることを発見しましたが、これ以上動作しないいくつかの文書化されていないトリックがあります。 – Goyo

0

もう1つの方法は、可能であればカメの中で作業し、tkinterを避けることです。以下の溶液に、代わりに窓を破壊し、新しいものを作る、我々は単に明確にし、新たに描く:

from turtle import Turtle, Screen 
from time import sleep 

def show_poly(turtle): 
    n = 0 

    while n < 3: 
     try: 
      n = int(input("How many sides do you want in your polygon? ")) 
     except ValueError: 
      pass 

    angle = 360/n 

    for _ in range(n): 
     turtle.forward(50) 
     turtle.left(angle) 

    sleep(3) 
    turtle.clear() 

window = Screen() 

tess = Turtle() 

show_poly(tess) 
show_poly(tess) 
show_poly(tess) 

window.bye() 

をこれもあなたのコードは `を提起はPython 2.7とPython 3

関連する問題