【问题标题】:Pygame window freezing when code is run运行代码时 Pygame 窗口冻结
【发布时间】:2013-11-24 10:03:00
【问题描述】:

我试图让这段代码在按下鼠标右键时循环,据我所知代码没有任何问题,但是当我点击右键时 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

【问题讨论】:

  • 根据缩进的不同,这段代码有不同的解释方式,请修复。此外,帖子包含与问题无关的部分,请删除它们。
  • @möter:粘贴的代码使用了标签;我用空格替换了它们。
  • 好像你的 while pressing: 循环阻塞了事件线程。

标签: python pygame


【解决方案1】:

也许这只是粘贴代码中的一个缺陷,但对我来说,代码末尾的 if-statement 似乎不在 while-loop 中,所以你会得到一个无限循环,这导致您的窗口冻结。 问候,TheWormKill

【讨论】:

    【解决方案2】:

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

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

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

    现在在这里,我假设在按下按钮时会抛出 MOUSEBUTTONDOWN(中间有一定的间隔),或者有另一个事件这样做。如果是这样,您可以简单地为每个事件执行一次代码,而忽略循环。

    否则,您可以启动一个新线程,在某个变量为真时循环您的代码。然后,您可以在 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,而是在之后检查。这意味着你永远也达不到那个说法。

    【讨论】:

    • 我不太明白你想告诉我什么,你说我应该把循环放在哪里?
    • @user2993584:jazzpi 说你根本不应该有循环。
    • @user2993584:“每个事件执行一次你的代码,忽略循环。”
    • @jazzpi 这就是我尝试制作循环的全部原因,当按住鼠标右键时,图像需要不断移动。如果我在没有循环的情况下按住按钮,则 mousebuttondown 仅执行一次:O
    • @jazzpi 可能只是我像往常一样是个白痴,但我真的不知道你的回答告诉我该怎么做..:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多