如何在Python中一次运行多个while循环

如何在Python中一次运行多个while循环,python,pygame,Python,Pygame,我正在尝试为一个项目开发一个简单的Pygame程序,它只是以文本到语音的方式显示一些人脸和对话,但在最后有一个while循环,这是代码运行所必需的,但会阻止程序运行所需的另一个while循环。我试图添加的while循环使用了time.sleep(),因此,如果我试图将其放入第一个需要持续运行的块中,程序就会崩溃。我相信我可能正在看一些明显的东西,但任何帮助都将不胜感激,谢谢 代码如下: from random import randint from time import sleep impor

我正在尝试为一个项目开发一个简单的Pygame程序,它只是以文本到语音的方式显示一些人脸和对话,但在最后有一个while循环,这是代码运行所必需的,但会阻止程序运行所需的另一个while循环。我试图添加的while循环使用了
time.sleep()
,因此,如果我试图将其放入第一个需要持续运行的块中,程序就会崩溃。我相信我可能正在看一些明显的东西,但任何帮助都将不胜感激,谢谢

代码如下:

from random import randint
from time import sleep
import pygame
import pygame.freetype
import time
import random
run = True
pygame.init()

#faces
face = ['^-^', '^v^', '◠◡◠', "'v'", '⁀◡⁀']
talkingFace = ['^o^', '^▽^', '◠▽◠', "'▽'", '⁀ᗢ⁀']
currentFace = random.choice(face)

#background
screen = pygame.display.set_mode((800,600))
screen.fill((0,0,0))

#font and size
myFont = pygame.font.Font('unifont.ttf', 100)

#face render
faceDisplay = myFont.render(str(currentFace), 1, (0,255,0))

#center and draw face
text_rect = faceDisplay.get_rect(center=(800/2, 600/2))
screen.blit(faceDisplay, text_rect)

#prevent crashes
while run:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            run = False
    pygame.display.flip()

#loop i'm trying to add
while run:
    faceDisplay = myFont.render(str(currentFace), 1, (0,255,0))
    screen.blit(faceDisplay, text_rect)
    time.sleep(randint(5, 10))

不,事情不是这样的。您有一个应用程序循环,所以请使用它<代码>时间。睡眠,或者不是典型应用程序中等待或延迟某件事情的方式。您等待时,游戏没有响应。用来测量时间

在pygame中,可以通过调用获取系统时间,它返回自调用以来的毫秒数。见模块

计算需要更改文本的时间点。获取新的随机文本,并在当前时间大于计算的时间点后渲染文本曲面。计算大于当前时间的新随机时间点:

next\u render\u time=0
运行时:
当前时间=pygame.time.get_ticks()
# [...]
如果当前时间>=下一次渲染时间:
currentFace=随机。选择(面)
faceDisplay=myFont.render(str(currentFace),1,(0255,0))
下一次渲染时间=当前渲染时间+randint(5,10)*1000
屏幕填充((0,0,0))
屏幕。blit(面显示,文本显示)
pygame.display.flip()
时间乘以1000(
randint(5,10)*1000
),因为
pygame.time.get_ticks()
的时间单位是毫秒

实际上,您还可以使用计时器事件。请参阅。
但是,在您的情况下,时间间隔不是恒定的。在动态变化的时间间隔上使用计时器事件有点奇怪。对于需要以固定间隔执行的操作,我更愿意使用计时器事件。但这只是我的意见


完整示例:

来自随机导入randint
从时间上导入睡眠
导入pygame
导入pygame.freetype
导入时间
随机输入
运行=真
pygame.init()
#面孔
面=['^-^','^v^','◠◡◠', “v”字◡⁀']
talkingFace=['^o^','^▽^', '◠▽◠', "'▽'", '⁀ᗢ⁀']
currentFace=随机。选择(面)
#背景
screen=pygame.display.set_模式((800600))
#字体和大小
myFont=pygame.font.font('unifont.ttf',100)
#面渲染
faceDisplay=myFont.render(str(currentFace),1,(0255,0))
#居中画面
text_rect=faceDisplay.get_rect(中心=(800/2600/2))
下一次渲染时间=0
#防止撞车
运行时:
当前时间=pygame.time.get_ticks()
对于pygame.event.get()中的e:
如果e.type==pygame.QUIT:
运行=错误
如果当前时间>=下一次渲染时间:
currentFace=随机。选择(面)
faceDisplay=myFont.render(str(currentFace),1,(0255,0))
下一次渲染时间=当前渲染时间+randint(5,10)*1000
屏幕填充((0,0,0))
屏幕。blit(面显示,文本显示)
pygame.display.flip()

您必须将
循环分离为一个方法,然后在
线程
上运行该方法。请参阅本文了解
线程
的工作原理