【问题标题】: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 秒并继续运行?

【问题讨论】:

    标签: python for-loop pygame


    【解决方案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 圈在它关闭之前被绘制。
    猜你喜欢
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多