2013-11-24 168 views
0

我試圖讓這個代碼循環,當按下鼠標右鍵時,據我可以看到有沒有錯誤的代碼,但pygame窗口凍結,當我點擊右鍵。 這裏是我的代碼,我試圖運行:Pygame窗口凍結時代碼運行

elif event.type == MOUSEBUTTONDOWN and event.button == 3: 
    pressing = 1 
    while pressing: 
     x, y = pygame.mouse.get_pos() 
     x1, y1 = x - space_ship_rect.x, y - space_ship_rect.y 
     angle = math.atan2(y1, x1) 
     movex = speed*math.cos(angle) 
     movey = speed*math.sin(angle) 
     space_ship_rect.centerx += movex 
     space_ship_rect.centery += movey 
     print("Right Button Pressed") 
    if event.type == MOUSEBUTTONUP: 
     pressing = 0 
+0

根據縮進情況,有不同的方法來解釋此代碼,請修復它。此外,該發佈包含與該問題無關的部分,請刪除它們。 – XORcist

+1

@möter:粘貼的代碼使用製表符;我用空格替換了它們。 –

+0

看起來像你的'while while press:'循環阻塞事件線程。 – Sinkingpoint

回答

0

我不太熟悉pygame的,所以下面這完全是根據了我其他的事件處理程序的知識。

事件處理程序通常工作的方式是,它們的函數每執行一次新事件就執行一次。在這個句柄中,他們不會響應新的事件。由於MOUSEBUTTONUP將是一個新事件,因此您需要單獨處理。

事件處理程序無法按照當前設置代碼的方式執行,因爲它處於MOUSEBUTTONDOWN狀態,凍結窗口。

現在在這裏,我會假設MOUSEBUTTONDOWN在按下按鈕時被拋出(在一定間隔之間),或者有另一個事件發生。如果是這樣,你可以簡單地對每個事件執行一次代碼,而忽略循環。

否則,您可以啓動一個新的線程來循環您的代碼,同時某些變量爲true。您可以在MOUSEBUTTONUP處理程序中將此變量設置爲false。

定義該事件處理程序之外:

elif event.type == MOUSEBUTTONDOWN and event.button == 3: 
    mouse_pressing = True 
    thread.start_new_thread(mouse_pressing_func,()) 
elif event.type == MOUSEBUTTONUP and event.button == 3: 
    mouse_pressing = False 

編輯:

現在,壓痕的固定,我看到

import thread 

mouse_pressing = True 

def mouse_pressing_func(): 
    while mouse_pressing: 
     # Do fancy stuff 

然後在你的事件處理程序使用此您還遇到了另一個問題:您甚至不會檢查事件是否是循環中的MOUSEBUTTONUP,而是之後。這意味着你甚至不會達到那個聲明。

+0

我並不完全理解你想告訴我什麼,你在說什麼我應該把循環? – user2993584

+0

@ user2993584:jazzpi說你根本不應該有一個循環。 –

+0

@ user2993584:「每個事件執行一次您的代碼,忽略循環。」 – jazzpi

0

也許它只是在粘貼代碼中的缺陷,但對我來說,它看起來像if語句來在你的代碼istn't結束在while -loop,所以你得到一個無限循環,從而導致你的窗口凍結。 Greets,TheWormKill