pygame窗口运行后停止响应

时间:2018-08-06 20:31:51

标签: python pygame

每当我启动程序时,外壳程序都会工作,但是pygame窗口会立即停止响应。我以前在pygame上画过东西,但这是第一次发生。没有错误消息,只是当我将光标悬停在它上面时,它是正在加载的符号,不久后,窗口要求我等待或停止该程序。 (我在javascript中使用了代码段,但代码在python中。对不起,我的新手编码布局。)

import pygame
from time import sleep
def multitype(string, whole_str_time):
    len_of_str = len(string)
    no_of_character = 0
    secs_bet_let = whole_str_time / len_of_str
    while no_of_character != len_of_str - 1:
        print(string[no_of_character], end = '')
        no_of_character += 1
        sleep(secs_bet_let)
    print(string[no_of_character])
pygame.init()
black = (0,0,0)
white = (255,255,255)
playercoords_a = (275,425)
playercoords_b = (275,475)
playercoords_c = (225,475)
playercoords_d = (225,425)
playertotalcoords = (playercoords_a, playercoords_b, playercoords_c, playercoords_d)
windowSurface = pygame.display.set_mode((500, 500),0,32)
windowSurface.fill((0,0,0,))
xmod = 0
ymod = 0
pygame.draw.polygon(windowSurface,white,((275,425),(275,475),(225,475),(225,425)))
pygame.display.update()
sleep(5)
multitype('type up to go up, left to go left, right to go right and down to go down',2)
while True:
    command = input()
    if command == 'up':
        xmod += 50
        print('updated')
    elif command == 'right':
        ymod += 50
        print('updated')
    elif command == 'left':
        ymod -= 50
        print('updated')
    elif command  == 'down':
        xmod -= 50
        print('updated')
    else :
        print('invalid instruction')
    pygame.draw.polygon(windowSurface,white,((275 + xmod,425 + ymod),(275 + xmod,475 + ymod),(225 + xmod,475 + ymod),(225 + xmod,425 + ymod)))
    pygame.display.update()

1 个答案:

答案 0 :(得分:1)

执行此操作时:

sleep(5)

…您正在使整个解释器进入睡眠状态5秒钟,在此期间它无法响应任何事件,更新屏幕或执行其他任何操作。

然后调用此函数:

multitype('type up to go up, left to go left, right to go right and down to go down',2)

…一次也可以执行sleep束,而不处理事件。

然后,您进入等待input()的循环。只要它在等待键盘输入,就不会再处理事件。

忽略事件和更新几秒钟后,Windows将检测到该程序没有响应,并询问您是否要等待或停止该程序。

如果您希望您的应用程序具有响应能力,则需要处理事件并至少每秒每秒几次调用pygame.display.update()。这意味着分拆长sleep s。

如果您完成任何PyGame教程,将有一节介绍延迟游戏逻辑的方法,该方法并不涉及整个程序的挂起。两个主要选项是编写一个框架循环(无论什么情况,每秒更新X次),或编写一个事件循环(每当操作系统说有事件发生时,它都会更新)。然后,除了sleep(5)之外,您还必须跟踪何时要执行下一件事,继续循环以及在达到该时间时要做下一件事。

这意味着input和PyGame通常不能很好地一起玩。您可以通过使用后台线程或使用非阻塞的stdin或其他方式来强制使其发挥良好,但没有微不足道的解决方案。 (大多数游戏和大多数GUI都是从图形窗口而不是从控制台获取输入。)