上下文 我当前自动完成一些工作的项目是创建一个程序来提示图片,允许我输入图片的名称,然后将其保存在桌面上的新文件夹中进行排序。
现状: 我已经使用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()
答案 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()