首页 > 解决方案 > Pygame在循环中填充背景时闪烁

问题描述

我正在尝试使用 pygame 在 python 中进行排序可视化。我必须在循环中画线,因为它们将在数组中移动。由于运动,我还必须在每个循环中重新绘制背景。但是,这会导致一些可怕的闪烁。有什么办法可以阻止这一切?还是我只是这样做完全错误?

import pygame

import numpy as np

Width = 800
Height = 500
numlines = 50
linewidth = int(Width / numlines)

win = pygame.display.set_mode((Width, Height))
pygame.display.set_caption("Quicksort Visualization")

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

randnums = np.random.randint(1, Height - 10, numlines)


def draw_arr(win, arr):
    win.fill(black)
    nums = arr
    i = 1
    for num in nums:
        pygame.draw.line(
            win,
            white,
            (i * linewidth, Height),
            (i * linewidth, Height - num),
            linewidth,
        )
        pygame.display.flip()
        i = i + 1


def main(win, arr):
    run = True
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        draw_arr(win, arr)
    pygame.quit()


main(win, randnums)

标签: pythonpygame

解决方案


问题是由pygame.display.flip()循环调用引起的。多次调用pygame.display.update()pygame.display.flip()每帧会导致闪烁。每次调用时pygame.display.flip(),显示都会更新。由于显示在循环开始时被清除 ( win.fill(black)),因此场景未完全更新。

在应用程序循环结束时调用它一次:

def draw_arr(win, arr):
    win.fill(black)
    nums = arr
    i = 1
    for num in nums:
        pygame.draw.line(
            win,
            white,
            (i * linewidth, Height),
            (i * linewidth, Height - num),
            linewidth,
        )
        # pygame.display.flip() <--- DELETE
        i = i + 1

    pygame.display.flip() # <--- INSERT

推荐阅读