为啥我的程序没有延迟 1 秒? [复制]

Posted

技术标签:

【中文标题】为啥我的程序没有延迟 1 秒? [复制]【英文标题】:Why my program doesnt get delayed for 1 second? [duplicate]为什么我的程序没有延迟 1 秒? [复制] 【发布时间】:2021-05-23 18:22:58 【问题描述】:

我在 python 中做一个随机游走程序,并使用 Pygame 来制作图形。

程序运行良好,但是我希望在代码末尾的每个for loop 中,它应该延迟程序 1 秒,因此程序在几秒钟内完成,但我可以看到连续随机游走。

所以当我在代码末尾添加time.sleep(1) 时,反而会使程序运行速度变慢,并且不会每秒画一个圆圈:

import pygame
import random
import time


#Initialize the pygame
pygame.init()

#create the screen
screen = pygame.display.set_mode((800,800)) # Width and Height 

startX = 400
startY = 400


def returnRandomNumber():
    options = [1,-1]
    
    random_sample = random.choice(options)

    return random_sample

def returnRandomInt():
    random_sample = random.randint(0,255)

    return random_sample


running = True
while running:
    #update display
    pygame.display.update()


    for x in range(10000):
        pygame.draw.circle(screen, (returnRandomInt(),returnRandomInt(),returnRandomInt()), (startX, startY), 2, 2)
        if startX <= 0:
            startX += 1
        elif startX >= 800:
            startX += -1
        else:
            startX += returnRandomNumber()
        
        if startY <= 0:
            startY += 1
        elif startY >= 800:
            startY += -1
        else:
            startY += returnRandomNumber()
    time.sleep(1)

为什么会发生这种情况?或者我怎样才能让程序画一个圆圈然后延迟 x 秒并继续运行?

【问题讨论】:

【参考方案1】:

time.sleep(1)需要和pygame.display.update()交换位置

代码: 导入pygame 随机导入 进口时间

初始化pygame

pygame.init()

创建屏幕

screen = pygame.display.set_mode((800, 800)) # 宽度和高度

开始X = 400 开始Y = 400

def returnRandomNumber(): 选项 = [1, -1]

random_sample = random.choice(options)

return random_sample

def returnRandomInt(): random_sample = random.randint(0, 255)

return random_sample

运行 = 真 在跑步的时候: # 更新显示 time.sleep(1)

for x in range(10000):
    pygame.draw.circle(screen, (returnRandomInt(), returnRandomInt(), returnRandomInt()), (startX, startY), 2, 2)
    if startX <= 0:
        startX += 1
    elif startX >= 800:
        startX += -1
    else:
        startX += returnRandomNumber()

    if startY <= 0:
        startY += 1
    elif startY >= 800:
        startY += -1
    else:
        startY += returnRandomNumber()
pygame.display.update()

【讨论】:

抱歉,您的答案不适用于每个系统,因为您不处理内部循环中的事件。 您好,请问正确答案是什么?【参考方案2】:

尝试在你的 for 循环中插入更新和睡眠,这样你的显示会在每次迭代后更新:

while running:
#update display
pygame.display.update()


for x in range(10000):
    pygame.draw.circle(screen, (returnRandomInt(),returnRandomInt(),returnRandomInt()), (startX, startY), 2, 2)
    if startX <= 0:
        startX += 1
    elif startX >= 800:
        startX += -1
    else:
        startX += returnRandomNumber()
    
    if startY <= 0:
        startY += 1
    elif startY >= 800:
        startY += -1
    else:
        startY += returnRandomNumber()
    pygame.display.update()
    time.sleep(1)

【讨论】:

谢谢!确实有效!但是我注意到几秒钟后程序崩溃了,它也发生过,但我认为这是因为无限的while循环,有什么想法吗? 你画了很多圈 - 每次迭代 10000 个,而且它不会停止。因此,您可能希望专注于这段代码并少画圈 - 可能会在几个之后停止。 我想象过,但是在放置 time.sleep 之前它会在崩溃之前绘制数千个圆圈,但是在放置 time.sleep(1) 之后它会绘制 10 个圆圈然后崩溃。 也许 python 会滞后,但重要的是你画的是无限的圆,所以你正在崩溃脚本。 是的,我不知道这是 python 还是 pygame 问题,感谢您的输入,它有效。然而,我尝试了最后一件事,我在程序中添加了一个计数器变量,这样每个 for 循环都会添加 1,并且当它达到与 for 循环中的范围相同的数字时。它将停止程序。所以我注意到程序是如何崩溃并停止绘制的,但几秒钟后它关闭了,在很短的时间内我可以看到其他 x 圈在它关闭之前被绘制。

以上是关于为啥我的程序没有延迟 1 秒? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的信号量程序打印 20 秒而不是 10 秒?

为啥我用centos7有点小卡啊?配置给足了,就是鼠标放到图标上时高亮延迟0.5秒启动程序有2秒

为啥我的 java 应用程序模糊? [复制]

为啥不以指定的延迟进行 ajax 调用

偶尔会遇到长时间的垃圾收集延迟,为啥?

如何在特定时间运行我的代码? [复制]