pygame窗口在单击时没有响应

问题描述 投票:1回答:4

我正在使用pygame在我正在处理的项目上进行界面显示和控制器输入。当前,一切工作都很好,因此这不是主要问题,但是,如果在实际使用过程中意外发生,则可能会出现一些问题,因此我想解决这个问题。

当我运行代码时,pygame窗口会完全按照预期的方式显示,显示和更新。但是,如果我单击它,或者它以其他方式获得焦点,则窗口将冻结并变为(无响应)。代码本身继续运行,包括负责更新显示的线程,直到我关闭窗口,这样Python本身仍然可以正常运行,但是窗口停止工作。

我的更新循环代码在这里,非常丑陋:

    while(1):
        print "thread is fine"
        pygame.event.pump()

        if LOV_Flag == 1:
            videoColor = (255, 0, 0)
        else:
            videoColor = (0, 255, 0)

        # Refresh the screen and redraw components

        screen.fill((255, 255, 255))
        pulseLabel = pulseFont.render("Pulse: ", 1, (0, 0, 0))
        videoLabel = videoFont.render("Video: ", 1, (0, 0, 0))
        motorsLabel = labelFont.render("Motors", 1, (0, 0, 0))
        motorLabel = captionFont.render("L         R", 1, (0, 0, 0))
        armLabel = captionFont.render("Arm", 1, (0, 0, 0))
        gripperLabel = captionFont.render("Gripper", 1, (0, 0, 0))
        screen.blit(motorsLabel, (55, 50))
        screen.blit(motorLabel, (60, 75))
        screen.blit(pulseLabel, (300, 19))
        screen.blit(videoLabel, (300, 45))
        screen.blit(armLabel, (250, 75))
        screen.blit(gripperLabel, (235, 255))
        leftBar = (50, 200 - drive.getSpeed()[0], 25, drive.getSpeed()[0])
        rightBar = (100, 200 - drive.getSpeed()[1], 25, drive.getSpeed()[1])
        armBar = (250, 200 - (100 * arm.report()), 25, (100 * arm.report()))
        upperArmBar = (250, 200 - (100 * arm.reportUp()), 25, 2) # 100 is the value on the bar
        lowerArmBar = (250, 200 - (100 * arm.reportDown()), 25, 2) # 135 (65) is the value on the bar
        gripperBar = (212, 225, (100 * hand.report()), 25)
        leftGripperBar = (212 + (100 * hand.reportClosed()), 225, 2, 25)
        rightGripperBar = (212 + (100 * hand.reportOpen()), 225, 2, 25)
        pygame.draw.rect(screen, (255, 0, 0), leftBar, 0)
        pygame.draw.rect(screen, (255, 0, 0), rightBar, 0)
        pygame.draw.rect(screen, (255, 0, 0), armBar, 0)
        pygame.draw.rect(screen, (0, 0, 0), upperArmBar, 0)
        pygame.draw.rect(screen, (0, 0, 0), lowerArmBar, 0)
        pygame.draw.rect(screen, (255, 0, 0), gripperBar, 0)
        pygame.draw.rect(screen, (0, 0, 0), leftGripperBar, 0)
        pygame.draw.rect(screen, (0, 0, 0), rightGripperBar, 0)
        pygame.draw.circle(screen, pulseColor, [370, 32], 10)
        pygame.draw.circle(screen, videoColor, [370, 58], 10)
        pygame.display.update()

        time.sleep(0.1)
        if killFlag:
            return

关于窗口外观的image,以帮助您更好地理解代码。

python pygame
4个回答
1
投票

不幸的是,我无法运行您发布的代码来进行自我测试,但是我想指出一些可能会有所帮助的内容。首先,这不是杀死程序的正确方法,至少不是我所知道的方法。我在pygame中使用的是:


1
投票

我将这段代码移到了main而不是线程上,现在可以运行了。我最终确实需要pygame.event.pump()行,现在我使用clock.tick()进行速率控制,但是它是相同的,但是被移动了。显然pygame不能很好地与线程打交道。


0
投票

事件队列可能已满,无法处理更多事件,因此操作系统表示窗口没有响应。


0
投票

问题是线程,我遇到了同样的问题,如果我在线程中运行pygame更新,则在更改焦点时它会锁定,如果我在没有线程的情况下运行它,则相同的代码可以正常工作。解决方法是确保仅从您的主原始线程中调用“ pygame”,然后其他代码可以位于其他线程中,但是与pygame相关的所有操作都应来自主线程。无论如何,这对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.