2017-10-08 49 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() 

我得到的第一個電話正常工作,比我得到這個錯誤

回溯(最近通話最後一個): 文件 「/home/turte.py」 19行, 在show_poly()

文件 「/home/turte.py」,8號線,在show_poly 苔絲= turtle.Turtle()

文件 「/usr/lib/python3.5/turtle.py」,線3816,在INIT 可見=可見)

文件「/ usr/lib中/python3.5/turtle.py」,線路2557,在初始化 self._update()

文件 「/usr/lib/python3.5/turtle.py」,線2660,在_Update 自我._update_data()

文件「/usr/lib/python3.5/tu rtle.py」,線路2646,在_update_data self.screen._incrementudc()

文件 「/usr/lib/python3.5/turtle.py」,線1292,在_incrementudc

養甲魚的終結者.Terminator

如果我明白了問題,即使關閉了最後一個屏幕,我也無法創建新屏幕。 我運行python 3.5

+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

另一種方法是在龜內工作,並儘可能避免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