2016-07-07 6921 views
0

我有一個online tutorial的以下代碼來學習基於事件的編程,方法是在點擊鼠標時使停止燈改變狀態。這裏是我的代碼的全部:Python Turtle 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 

在本教程中,他們使用:

wn.mainloop() 

但我得到的錯誤:

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

並有能力使用

turtle.mainloop() 

爲什麼區別?我在Ubuntu中使用Python 2.7;該示例在PyScripter中。提前致謝。

回答

2

它在教程中似乎是一個錯誤。

在第4行,它們定義了wn = turtle.Screen(),這意味着後面調用wn.mainloop()等同於調用turtle.Screen().mainloop()

這沒有任何意義;因爲錯誤消息指出沒有.mainloop()方法turtle.Screen()。有,但是.mainloop()方法的基地turtle對象,這就是爲什麼調用的作品。

+0

啊,謝謝你清理它。 – DDauS

+0

僅供參考,沒有.mallloop()*方法*的龜對象 - turtle.mainloop()是一個*函數*調用龜圖書館。 Python 2將mainloop()定義爲頂級函數,它是TK的同義詞.mainloop - Python 3將mainloop()定義爲Screen方法(通過TurtleScreen,通過TurtleScreenBase),它調用TK.mainloop(),並且像許多其他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