代码运行时Pygame窗口冻结

时间:2013-11-24 10:03:00

标签: python 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

2 个答案:

答案 0 :(得分:0)

我对Pygame不太熟悉,所以以下完全基于我对其他事件处理程序的了解。

事件处理程序通常的工作方式是,每个新事件的执行次数一次。在此句柄中,它们不响应新事件。由于MOUSEBUTTONUP将是一个新事件,您需要单独处理它。

事件处理程序无法按照您当前设置代码的方式执行此操作,因为它处理了MOUSEBUTTONDOWN,冻结了窗口。

现在,我假设在按下按钮的同时抛出MOUSEBUTTONDOWN(中间有一定的间隔),或者还有另一个事件可以执行此操作。如果是这样,你可以简单地在每个事件中执行一次代码,而不用循环。

否则,您可以启动一个循环代码的新线程,而某些变量为true。然后,您可以在MOUSEBUTTONUP处理程序中将此变量设置为false。

在事件处理程序之外定义:

import thread

mouse_pressing = True

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

然后在事件处理程序中使用它:

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

修改

现在缩进已经修复了,我发现你还遇到了另一个问题:你甚至不检查你的循环中是否有MOUSEBUTTONUP事件,但之后。这意味着你甚至永远不会达到那个声明。

答案 1 :(得分:0)

也许这只是粘贴代码中的一个缺陷,但对我而言,代码末尾的if - 语句似乎不在你的while循环中,所以你得到了一个无限循环,导致窗口冻结。 Greets,TheWormKill