簡體   English   中英

Turtle Graphics Python,.mainloop()

[英]Turtle Graphics Python, .mainloop()

我正在用Python編程,我有幾個問題無法在任何地方找到答案(請閱讀所有問題,以解決我的最后一個問題):

1 .mainloop()真正作用是什么? 我閱讀了Stack Overflow中的所有答案,還檢查了文檔說明。

.mainloop()一定總是在烏龜程序的末尾嗎?

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

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()函數時alex會收到一個動作事件? 我知道這樣做是因為調用了該函數,但是實際上發生了什么? 我的意思是說語句turtle.mainloop()在單擊turtle.mainloop()之前運行,並且tess的action事件在事件循環中等待,所以alex的事件如何進入事件循環,因為其語句在turtle.mainloop()之后運行跑?

1 .mainloop()的真正作用是什么?

Turtle的mainloop()調用mainloop()mainloop() ,后者調用Tk的Tk_MainLoop() ,這非常簡單:

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

當打開任何主窗口時,它可以無限循環地處理事件,一次一次。 處理的事件包括鍵盤輸入,按鈕單擊,窗口重塑,文件I / O,網絡活動,計時器,顯示刷新和任何其他已注冊的回調。

第15章的引言中可以找到關於mainloop的出色的一頁描述。在Steve Lidie和Nancy Walsh撰寫的O'Reily書籍Mastering Perl / Tk 中可以了解MainLoop 盡管這是一本Perl / Tk書,但有關mainloop的信息也適用於Python。 您可以在線找到該材料,但是我不包含鏈接,因為我不知道其中哪些在線副本是合法發布的。 但是您有足夠的信息來搜索它。

2. .mainloop()是否一定總是在烏龜程序的末尾嗎?

不可以。它應該是設計良好的程序的一部分,但不是必需的。 大多數獨立程序將包含它(或諸如.done().exitonclick() ),因為沒有它的圖形窗口將在完成時關閉。 但是有些情況,例如。 可能是“空閑”,不需要它來保持圖形可見。 我在初學者烏龜程序中發現的一個常見錯誤是,在調用mainloop()之前創建了一個烏龜活動無限循環,然后想知道為什么不觸發各種事件。

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

我們可以將烏龜編程看作是為Tk的主循環編寫插件代碼。 設置好之后,后續活動將通過我們通過on*()函數注冊的回調函數完成。

3.我以前用過mainloop()。 我的問題是,如果我有ffg代碼:...為什么在運行yes()函數時alex會得到一個動作事件

當您的程序運行時,海龜Alex和Tess在窗口中心彼此堆疊。 當您單擊該Turtle Stack時,事件將發給Tess,Tess居於首位並具有事件處理程序。 在她的事件處理程序中,Tess在Alex上安裝了一個事件處理程序。 在Alex上安裝事件處理程序的行為使Alex移到Tess的前面,上升到堆棧的頂部。 從現在開始,當您單擊烏龜堆棧時,Alex處理事件,事件不再到達Tess。 如果給它們提供不同的顏色和不同的事件處理程序,我們可以清楚地看到這一點:

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和Tess移到窗口中的不同位置,然后單擊它們以確認Alex直到第一次單擊Tess才開始接收事件。

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

所以說:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM