Pygame 全屏启动然后崩溃

时间:2021-05-24 17:58:46

标签: python sockets pygame udpclient

这是缩短的服务器代码,它应该从客户端接收屏幕截图,然后将其显示在服务器端的 pygame 屏幕上:

'''max_bytes = 64000
    udp_conn = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    udp_conn.bind(('0.0.0.0', 5000))
    pygame.init()
    screen = pygame.display.set_mode((1900, 1000))
    clock = pygame.time.Clock()
    while True:
        try:
            size_msg, address = udp_conn.recvfrom(max_bytes)
            size = int.from_bytes(size_msg, byteorder='big')
            while size > 10000000:  # if size is greater than 10M then loop has to fire to get value of the size of
                # the compressed img.
                size = int.from_bytes(size_msg, byteorder='big')
            temp_pixels = recvall(size, udp_conn, max_bytes)
            try:
                pixels = decompress(temp_pixels)
                scrn_img = pygame.image.fromstring(pixels, (950, 500), 'RGB')
                scrn_shot = pygame.transform.scale(scrn_img, (950, 500))
                # putting the screenshot on pygame screen
                screen.blit(scrn_shot, (0, 0))
                pygame.display.flip()
                clock.tick(60)
            except:
                pass
        except:
            pass
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        pygame.quit()
                        sys.exit()'''

pygame 屏幕从全屏开始,然后调整大小并崩溃……我不知道为什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为事件的 for 循环在 except 块中检查缩进并重试

这很好
并尝试将您的代码从这个更新到这个

max_bytes = 64000
udp_conn = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_conn.bind(('0.0.0.0', 5000))
pygame.init()
screen = pygame.display.set_mode((1900, 1000))
clock = pygame.time.Clock()
while True:
    try:
        size_msg, address = udp_conn.recvfrom(max_bytes)
        size = int.from_bytes(size_msg, byteorder='big')
        while size > 10000000:  # if size is greater than 10M then loop has to fire to get value of the size of
            # the compressed img.
            size = int.from_bytes(size_msg, byteorder='big')
        temp_pixels = recvall(size, udp_conn, max_bytes)
        try:
            pixels = decompress(temp_pixels)
            scrn_img = pygame.image.fromstring(pixels, (950, 500), 'RGB')
            scrn_shot = pygame.transform.scale(scrn_img, (950, 500))
            # putting the screenshot on pygame screen
            screen.blit(scrn_shot, (0, 0))
            pygame.display.flip()
            clock.tick(60)
        except:
            pass
    except:
        pass
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                pygame.quit()
                sys.exit()

为此

max_bytes = 64000
udp_conn = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_conn.bind(('0.0.0.0', 5000))
pygame.init()
screen = pygame.display.set_mode((1900, 1000))
clock = pygame.time.Clock()
while True:
    try:
        size_msg, address = udp_conn.recvfrom(max_bytes)
        size = int.from_bytes(size_msg, byteorder='big')
        while size > 10000000:  # if size is greater than 10M then loop has to fire to get value of the size of
            # the compressed img.
            size = int.from_bytes(size_msg, byteorder='big')
        temp_pixels = recvall(size, udp_conn, max_bytes)
        try:
            pixels = decompress(temp_pixels)
            scrn_img = pygame.image.fromstring(pixels, (950, 500), 'RGB')
            scrn_shot = pygame.transform.scale(scrn_img, (950, 500))
        except:
            pass
    except:
        pass
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                pygame.quit()
                sys.exit()
    # putting the screenshot on pygame screen
    screen.blit(scrn_shot, (0, 0))
    pygame.display.flip()
    clock.tick(60)

这是因为更新应该发生在每一帧上,而不仅仅是在加载图像时。
为了让这个工作,你可能应该为 scrn_shot 变量声明一个默认值。
并在 screen.fill((COLOR_IN_RGB)) 上方添加 screen.blit 这将在每一帧都用黑色填充屏幕。

并且您的程序应该可以正常工作。