为什么我的程序在它的中间冻结,然后在完成时解冻? - pygame

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我的程序在它的中间冻结,然后在完成时解冻? - pygame相关的知识,希望对你有一定的参考价值。

我正在尝试制作一个类似于“排序声音”的pygame程序,大约5-6秒后,它会冻结,直到排序结束。代码是:

import pygame, random
pygame.init()

clock = pygame.time.Clock()

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

x = []
ll = int(input("How big is the list you want to make? (Can't be more than your computer monitor's height: "))
for i in range(ll):
    x.append(i + 1)
random.shuffle(x)

h = pygame.display.Info().current_h
if(ll > h):
    quit()

gameDisplay = pygame.display.set_mode((ll, ll))

pygame.display.set_caption("Sort")

gameExit = False

while not gameExit:
    for event in pygame.event.get():
        if(event.type == pygame.QUIT):
            gameExit = True

    for i in range(len(x)):
        pygame.draw.rect(gameDisplay, white, [i, ll - x[i], 1, x[i]])

    n = len(x)
    for i in range(n - 1):
        small = i;
        for j in range(i + 1, n):
            if(x[small] > x[j]):
                small = j;
        temp = x[small]
        x[small] = x[i]
        x[i] = temp

        gameDisplay.fill(black)
        for i in range(len(x)):
            pygame.draw.rect(gameDisplay, white, [i, ll - x[i], 1, x[i]])

        clock.tick(60)

        pygame.display.update()

    pygame.display.update()

pygame.quit()
quit()

我不知道为什么它会冻结,也不知道为什么它等到排序结束才停止冻结。

答案

您的问题是您只在每个while循环传递开始时检查事件循环。您将所有时间都花在循环排序中,因此如果您不想等到排序结束,则应在排序时检查事件:

...
while not gameExit:
    # draw
    n = len(x)
    for i in range(n - 1): 
        # sort
        # draw
        for event in pygame.event.get():
            if(event.type == pygame.QUIT):
                gameExit = True

        if gameExit:
            break

        clock.tick(60)
        pygame.display.update()
...

以上是关于为什么我的程序在它的中间冻结,然后在完成时解冻? - pygame的主要内容,如果未能解决你的问题,请参考以下文章

QQ被冻结了,怎样用手机发短信解冻?

推特被永久封禁怎么登入别人的账号

sap库存到期冻结和解冻物料的区别是啥

PWA 应用程序在 iOS 13.4 上的应用程序切换期间冻结

为啥将文本添加到 RichEdit 窗口会冻结它?

Kivy GUI 冻结