Python 为什么这个pygame程序会冻结?

Python 为什么这个pygame程序会冻结?,python,pygame,Python,Pygame,下面是一个使用pygame的程序,它会随着值的变化更新直方图 但是,运行几秒钟后,程序冻结。有人能指出错误吗 import random import pygame SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600 FRAME_RATE = 50 BACKGROUND_COLOR = pygame.Color("white") BAR_COLOR = pygame.Color("Black") BUCKET_CNT = 20 pygam

下面是一个使用
pygame
的程序,它会随着值的变化更新直方图

但是,运行几秒钟后,程序冻结。有人能指出错误吗

import random
import pygame

SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
FRAME_RATE = 50
BACKGROUND_COLOR = pygame.Color("white")
BAR_COLOR = pygame.Color("Black")
BUCKET_CNT = 20

pygame.init()

screen = pygame.display.set_mode(SCREEN_SIZE)
screen.fill(BACKGROUND_COLOR)

buckets = BUCKET_CNT*[0]
bar_w = SCREEN_WIDTH / BUCKET_CNT

clock = pygame.time.Clock()
background = pygame.Surface(screen.get_size())
background.fill(BACKGROUND_COLOR)

while True:
    clock.tick(FRAME_RATE)
    random.seed()
    idx = random.randrange(BUCKET_CNT)
    buckets[idx] += 1

    # Create rectangles representing bars in the histogram.
    bars = [pygame.Rect(i*bar_w,
                        SCREEN_HEIGHT - buckets[i],
                        bar_w, buckets[i]) for i in range(BUCKET_CNT)]

    # Draw bars on the background
    [pygame.draw.rect(background, BAR_COLOR, b, 5) for b in bars]

    # Blit the background
    screen.blit(background, (0, 0))

    # Show "stuff" on the screen
    pygame.display.flip()
编辑

这些都是很好的建议。我已经更改了我的代码,用以跟踪它们,但是代码仍然冻结。下面是代码现在的样子:

import random
import pygame

SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
FRAME_RATE = 50
BACKGROUND_COLOR = pygame.Color("white")
BAR_COLOR = pygame.Color("Black")
BUCKET_CNT = 20
GROWTH_RATE = 10

pygame.init()

screen = pygame.display.set_mode(SCREEN_SIZE)
screen.fill(BACKGROUND_COLOR)

buckets = BUCKET_CNT*[0]
bar_w = SCREEN_WIDTH / BUCKET_CNT

clock = pygame.time.Clock()
background = pygame.Surface(screen.get_size())
background.fill(BACKGROUND_COLOR)

# Create rectangles representing bars in the histogram.
bars = [pygame.Rect(i*bar_w,
                    SCREEN_HEIGHT - buckets[i],
                    bar_w, buckets[i]) for i in range(BUCKET_CNT)]
random.seed()
while True:
    clock.tick(FRAME_RATE)
    idx = random.randrange(BUCKET_CNT)
    buckets[idx] += 1

    bars[idx].inflate_ip(0, GROWTH_RATE)

    # Draw bars on the background
    pygame.draw.rect(background, BAR_COLOR, bars[idx])

    # Blit the background
    screen.blit(background, (0, 0))

    # Show "stuff" on the screen
    pygame.display.flip()

我想为占用大家的时间而道歉。事实证明,代码没有问题。我的工作机器只是被各种各样的进程超载了。它正在运行一个多线程测试和一个虚拟机(目前正在编译一个非常大的代码库)。这就解释了为什么我的程序冻结了。谢谢DJMcMayhem尝试了这个代码。向亚历克斯·范·莱乌发出一声特别的呼喊。多亏了你,我今天学到了一些关于pygame的新东西。

你有没有发现任何回溯错误?我一眼就看不出任何错误,但线条
[pygame.draw.rect(背景,条形图颜色,b,5)对于条形图中的b]
可能应该更改。您不应该使用列表理解作为循环执行有副作用的方法的缩写;它不仅奇怪而且有点难读,它会在每个循环中创建一个新的列表,然后立即将其丢弃。这使得垃圾收集器的工作比它需要的要困难得多。冻结可能是内存耗尽,GC介入清理;从那时起,你就不再按部就班了(所以操作系统认为你被冻结了)。你还在每一帧(和一个列表)上创建了一堆新的条,然后你就把它们扔掉了,导致了类似的问题。如果您完全放弃列表理解,将这两种理解折叠成一个范围内的正常for循环,您可能会解决您的问题。另一件可能有用的事情是保持
,但将其移出循环,只需更换
条[idx]
每一帧,因为只有一条条(映射到
桶[idx]
的条)会更改每一帧。如果您想更高效,那么
Rect
类有一些可以使用的条(特别是
移动ip()
充气ip()
)这将允许您调整矩形的大小,而不是创建新的矩形。无论哪种方式,屏幕冻结的症状都是由时钟没有在每一帧上滴答作响引起的,因此循环中有一些东西导致时钟没有滴答作响。您应该更好地分析正在发生的情况。观察内存、调试、日志消息。。.