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時纔開始接收事件。
也許代碼以這種方式運行,但我不認爲這是它被解釋的方式。 – Volcano
我知道代碼打印語句不會運行,直到您關閉烏龜窗口,但這不是我正在尋找的信息。 – Volcano
哦,抱歉,這沒有幫助。也許我沒有很好地閱讀你的問題。你能解釋一下你在找什麼嗎? – Neeks