Python 快速连续显示多个图像的最佳方式

Python 快速连续显示多个图像的最佳方式,python,animation,pygame,Python,Animation,Pygame,我试图使用pygame快速连续地刷新多个图像,但下面的代码显示了一段时间的白色屏幕,然后在一瞬间显示一个图像,然后关闭 我哪里做错了 import glob import pygame import os import pathlib import time max_idx = 276 imgs_dir = 'path/to/imgs/...' pygame.init() w = 480 h = 480 size=(w,h) screen = pygame.display.set_mode(

我试图使用
pygame
快速连续地刷新多个图像,但下面的代码显示了一段时间的白色屏幕,然后在一瞬间显示一个图像,然后关闭

我哪里做错了

import glob
import pygame
import os
import pathlib
import time

max_idx = 276
imgs_dir = 'path/to/imgs/...'

pygame.init()
w = 480
h = 480
size=(w,h)
screen = pygame.display.set_mode(size) 
c = pygame.time.Clock()

idx = 0
while idx < max_idx:
    idx+=1
    print(idx)

    screen.fill((255,255,255))

    img_path = f'{imgs_dir}/{idx}.png'
    img = pygame.image.load(img_path)
    img_rect = img.get_rect()
    
    screen.blit(img, img_rect)
    pygame.display.update()
    
    c.tick(1000)

尝试在
主循环之外加载图像,因为加载需要一些时间。当
idx
变为
True
并且在276次迭代之后,程序将退出,现在帧速率设置为1000,减少帧数。 如果要防止程序退出,请从
while
条件中删除
idx
,并在关闭窗口时放置一些其他变量,这些变量将变为
True
(并可选择添加一些其他触发器),即:

同时将
pygame.quit()
放在末尾

编辑:解决方案代码

import pygame as pg
import os 

WIN_W = 500
WIN_H = 500
FPS = 2

clock = pg.time.Clock()

window = pg.display.set_mode((WIN_W, WIN_H))

images_list = []

def load_images(images_list):
    curr_dir = os.path.dirname(__file__)
    dir_images = os.path.join(curr_dir, "images")

    for i in range(2, 11, 2):   
        images_list.append(pg.image.load(os.path.join(dir_images, f"{i}c.png")))


load_images(images_list)


def redraw(i):

    window.blit(images_list[i], (0,0))

    pg.display.update()


run = True
while run:

    clock.tick(1)

    for event in pg.event.get():
        if event.type == pg.QUIT:
            run = False

    for i in range(len(images_list)):
        pg.time.wait(100)
        redraw(i)

pg.quit()
我使用
pygame.time.wait()
获得了想要的结果。我不是100%确定,但我认为我们之前尝试的问题是,无论FPS如何,for loop
中的整个代码都会立即执行,因此我们只看到最后一张图像。使用这种方法,每次只会发生一次闪电。我知道您希望在显示完成时退出程序,但这更便于测试


注意:不要忘记更改图像路径和变量名。

代码看起来不错。你确定图像文件中确实有内容,并且图像的大小与你想要显示的大小一致吗?嗨,格伦,图像确实存在(并且有内容),图像的大小与屏幕的设置大小相匹配。我错过了@kaktus_car在下面提到的你正在使用的帧速率,帧速率为1000将意味着它将尝试每秒处理1000帧,因此,如果它能够达到如此快的速度,它将在大约1/4秒内快速浏览所有276幅图像。这可能是你的问题的一部分。因为你所做的只是显示这些,所以你需要一个帧速率,这个帧速率可以持续你想要的时间。在您的情况下,您可能希望每帧超过一秒。尝试
c.勾选(0.5)
。我相信你可以使用帧速率,导致>1秒的帧间隔,虽然我从来没有尝试过。嗨,格伦,我的坏@卡库斯也指出了这一点,但这似乎并没有什么不同。它仍然保持空白(虽然现在更长),直到最后一个图像闪烁一次并关闭。嗨@kaktus_car,谢谢你。我已经更新了你的建议,但仍然没有达到预期效果。有什么想法吗?我很高兴让程序在完成后退出,因此我没有包括后一个建议的代码片段。您好,欢迎您。我认为您不需要每次变换图像,它们应该调整大小,但请检查此项。你能解释一下现在发生了什么吗?我看到你删除了
.fill(255255255)
,它会在每个循环中显示白色屏幕。谢谢,我测试了
转换和不转换
,这表明需要调整图像的大小。
填充
似乎没有效果,甚至在取出后也没有效果;屏幕弹出,等待并没有显示任何内容,直到最后一个图像闪烁一秒钟,然后关闭。哦,好的。为了清楚起见,您希望在屏幕上显示每个(276个)的图像,例如半秒,然后在显示最后一个图像后完成程序。我想自己试试,我会带着结果回来的。没错,非常感谢!我将观看此空间:)
run = True
...
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        run = False
import pygame as pg
import os 

WIN_W = 500
WIN_H = 500
FPS = 2

clock = pg.time.Clock()

window = pg.display.set_mode((WIN_W, WIN_H))

images_list = []

def load_images(images_list):
    curr_dir = os.path.dirname(__file__)
    dir_images = os.path.join(curr_dir, "images")

    for i in range(2, 11, 2):   
        images_list.append(pg.image.load(os.path.join(dir_images, f"{i}c.png")))


load_images(images_list)


def redraw(i):

    window.blit(images_list[i], (0,0))

    pg.display.update()


run = True
while run:

    clock.tick(1)

    for event in pg.event.get():
        if event.type == pg.QUIT:
            run = False

    for i in range(len(images_list)):
        pg.time.wait(100)
        redraw(i)

pg.quit()