pygame幻灯片冻结

时间:2016-11-29 03:20:56

标签: python python-3.x pygame

上下文 我当前自动完成一些工作的项目是创建一个程序来提示图片,允许我输入图片的名称,然后将其保存在桌面上的新文件夹中进行排序。

现状: 我已经使用pygame整理了一个基本的幻灯片应用程序(Tried Tkinter,我遇到了循环问题并允许输入,所以我废弃了它)。下面的程序适用于2/3图片,然后完全冻结,如果我移动pygame窗口,它会再次被砖块化。

问题: 有没有更好的方法来骑自行车拍摄的照片?或者有没有办法阻止pygame冻结?我不认为它有内存泄漏,但我只是一个菜鸟。

所有建议/帮助欢迎,如果您能提供任何指导以达到我的最终目标,我将不胜感激!

戴夫

import pygame
from pygame.locals import *
import os
from os import listdir

location = input()
os.chdir(location)
main = os.listdir()
print(main)

pygame.init()

display_width = 500
display_height = 500

black = (0,0,0)
white = (255,255,255)
blue = (0,0,255)

gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('A bit racey')
clock = pygame.time.Clock()

def car(x,y):
    for image in main:
        print(image)
        carImg = pygame.image.load(image)
        picture = pygame.transform.scale(carImg, (500, 500))
        gameDisplay.blit(picture,(x,y))
        pygame.display.update()
        pygame.time.delay(2000)
        gameDisplay.fill(white)

x = (0)
y = (0)

crashed = False

while not crashed:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True
    gameDisplay.fill(blue)
    car(x,y)
    pygame.display.update()
    clock.tick(60)

pygame.quit()
quit()

1 个答案:

答案 0 :(得分:3)

您的操作系统认为程序已冻结,因为您未及时调用事件模块中的任何功能。

轻松修复只是将行pygame.event.pump()放在car()函数中。然而,这不是一个好的修复,因为您仍然无法处理关闭窗口等任何事件。当您输入car函数时,您将程序延迟2*amount_of_images秒,使程序无法执行任何其他操作。

我会为你的程序做一个完整的重构(见下文)。另外,我看到你正在研究sentdex pygame教程。确保根据程序命名变量,这样才有意义。 car(x, y)不是显示图像的好名称,main不是目录列表的好名称。尝试遵循PEP8,使用lowercase_and_underscore命名所有变量和函数,因为它是Python的约定。遗憾的是,Sentdex没有遵循这些。

以下是我将如何做的简短示例(尽管还有很多其他方法):

import pygame
pygame.init()

def load_images():  # This is just a mock-up function.
    images = []
    for i in range(5):
        image = pygame.Surface((500, 360))
        image.fill((51*i, 100, 100))
        images.append(image)
    return images


def main():
    clock = pygame.time.Clock()
    time = 0  # Time to keep track of when to swap images.
    images = load_images()  # List of images.
    image_index = 0  # Current image that's being displayed.
    total_images = len(images)

    while True:

        dt = clock.tick(60) / 1000  # Amount of seconds between each loop.
        time += dt

        if time >= 2:  # If 2 seconds has passed.
            image_index = (image_index + 1) % total_images  # Increment by one and cylce to 0 if greater than 'total_images'
            time = 0  # Reset the time.

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    image_index = (image_index - 1) % total_images
                    time = 0
                elif event.key == pygame.K_RIGHT:
                    image_index = (image_index + 1) % total_images
                    time = 0

        screen.blit(images[image_index], (110, 60))  # Blit current image at whatever position wanted.
        pygame.display.update()

if __name__ == '__main__':
    SIZE = WIDTH, HEIGHT = 720, 480
    screen = pygame.display.set_mode(SIZE)
    main()