2016-09-10 442 views
1

我在Python編程,我有,我不能找到答案隨時隨地幾個問題(請閱讀所有的問題,因爲他們建立了我的最後一個問題):烏龜圖形的Python,.mainloop()

1. .mainloop()真的幹什麼?我閱讀了堆棧溢出中的所有答案,我也檢查了文檔解釋。

2. .mainloop()總是必須在烏龜計劃的最後?

3.我以前用過.mainloop()。我的問題是,如果我有f.f.g代碼:

import turtle 

screen = turtle.Screen() 
alex = turtle.Turtle() 
tess = turtle.Turtle() 

def yes(x, y): 
    alex.onclick(yes) 
    print("Hello World") 

tess.onclick(yes) 
turtle.mainloop() 

爲什麼亞歷克斯得到一個動作事件時功能yes()運行?我知道這是因爲函數被調用,但實際發生了什麼?我的意思是turtle.mainloop()是在tess被點擊前運行的,並且在事件循環中等待tess的動作事件,所以在運行turtle.mainloop()後,alex的事件如何進入事件循環?

回答

0

所以mainloop()是一個無限循環,基本上阻止了你的代碼在某個點執行。你只需要調用一次(並且只能調用一次)。

所以可以說:

while true: 
circle.draw() 
sumden.mainloop() 
print "circle is being drawn" 
time.sleep(0.1) 

你永遠不會看到輸出和打印語句,因爲沒有循環。

+0

也許代碼以這種方式運行,但我不認爲這是它被解釋的方式。 – Volcano

+0

我知道代碼打印語句不會運行,直到您關閉烏龜窗口,但這不是我正在尋找的信息。 – Volcano

+0

哦,抱歉,這沒有幫助。也許我沒有很好地閱讀你的問題。你能解釋一下你在找什麼嗎? – Neeks

2

1.mainloop()究竟做了什麼?

烏龜的mainloop()電話的Tkinter的mainloop()它調用Tk的的Tk_MainLoop()這是出奇的簡單:

void 
Tk_MainLoop(void) 
{ 
    while (Tk_GetNumMainWindows() > 0) { 
     Tcl_DoOneEvent(0); 
    } 
} 

它,而有任何主窗口打開處理事件,一次一個,無限循環。處理的事件包括鍵盤輸入,按鈕點擊,窗口重塑,文件I/O,網絡活動,定時器,顯示刷新和任何其他註冊回調。

一種性能優良,主循環的一個頁面描述可以在引進發現第15章主循環的解剖在O'Reily書掌握的Perl/Tk的由史蒂夫Lidie和南希·沃爾什。雖然它是一本Perl/Tk書,但關於mainloop的信息也適用於Python。你可以在網上找到這些材料,但我不會在這裏包含鏈接,因爲我不知道哪些在線副本是合法發佈的。但是你有足夠的信息來搜索它。

2. .mainloop()總是必須在一個龜的程序結束?

不是。它應該是精心設計的程序的一部分,但不是必需的。大多數獨立程序將包括它(或稱之爲.done().exitonclick()),因爲圖形窗口將在沒有它的情況下關閉。但有些情況下,例如。 IDLE也許不需要它來保持圖形可見。我在初學者的烏龜程序中發現的一個常見錯誤是,在調用mainloop()之前創建一個無限循環的龜活動,然後想知道爲什麼各種事件不會觸發。

如果您打算讓Tk爲您處理鍵盤,鼠標和計時器事件,那麼致電.mainloop()是您開始的方式。在大多數Python/Tk程序中,這是最後一條語句,但是當所有Tk窗口全部關閉時,可以在其後執行其他代碼。

我們可以將龜編程視爲編寫Tk主循環的插件代碼。設置好之後,後續活動將通過我們通過on*()函數註冊的回調函數完成。

3.我以前使用過mainloop()。我的問題是,如果我有FFG代碼:...當函數 是()運行

當程序運行時爲什麼亞歷克斯得到一個動作事件,海龜Alex和苔絲堆積頂部彼此在窗戶的中央。當你點擊這個烏龜堆棧時,事件將發送給Tess,他們都在頂層並且有一個事件處理程序。在她的事件處理程序中,Tess在Alex上安裝了一個事件處理程序。在亞歷克斯上安裝事件處理程序的行爲導致Alex在Tess面前移動,並升至棧頂。從現在起,當你點擊海龜堆棧時,Alex處理事件,他們不再觸及苔絲。我們可以清楚地看到這一點,如果我們給他們不同的顏色和不同的事件處理程序:

import turtle 

alex = turtle.Turtle(shape="turtle") 
alex.color("blue") 

tess = turtle.Turtle(shape="turtle") 
tess.color("pink") 

def tess_handler(x, y): 
    alex.onclick(alex_handler) 
    print("Tess clicked") 

def alex_handler(x, y): 
    print("Alex clicked") 

tess.onclick(tess_handler) 

turtle.mainloop() 

點擊龜棧上產生:

> python3 test.py 
Tess clicked 
Alex clicked 
Alex clicked 
Alex clicked 
Alex clicked 
Alex clicked 
Alex clicked 

你可以在窗口中移動Alex和苔絲到不同的位置和然後點擊它們以確認Alex在第一次單擊Tess時纔開始接收事件。