2013-11-24 120 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