我试图在按下鼠标右键时循环显示此代码,据我所知,代码没有任何问题,但是当我点击右键时,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 :(得分: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