pygame.key.get_pressed() - 不起作用 - pygame.error:视频系统未初始化

时间:2014-03-01 19:29:47

标签: python python-3.x error-handling key pygame

我的程序有两个问题:

  1. 当我关闭我的程序时,它有错误:keys = pygame.key.get_pressed() pygame.error: video system not initialized
  2. 在我按下' d'当我按某事(或移动鼠标)时
  3. 代码的重要部分是:

    import pygame
    from pygame.locals import*
    
    pygame.init()
    
    screen = pygame.display.set_mode((1200, 700))
    ticket1 = True
    
    # ...
    
    c = 550
    d = 100
    
    # ...
    
    color2 = (250, 20, 20)
    
    while ticket1 == True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                ticket1 = False
                pygame.quit()
                pygame.display.quit()
    
            keys = pygame.key.get_pressed()
    
            if keys[pygame.K_d]:
                c += 1
    
        # ...
    
        screen.fill((255, 250, 245))
    
        pygame.draw.rect(screen, color2, pygame.Rect(c, d, 50, 75))
    
        pygame.display.flip()
    

    如果我在while循环中写keys = pygame.key.get_pressed()它没有错误,但似乎更慢。

    我还有另一个错误:pygame.error: display Surface quit,但我总是在我所有的pygame程序中都有它并且它不是那么重要但其他事情很重要。

2 个答案:

答案 0 :(得分:2)

1 .--------------

pygame.quit()之后,您不需要pygame.display.quit(),而是sys.exit()pygame.quit()未退出计划,因此该计划仍会尝试拨打screen.fill()以及pygame.quit()以下的其他功能

或者您必须将pygame.quit()放在while ticket == True:之外(然后您不需要sys.exit()

您可以使用while ticket1:代替while ticket == True: - 它更加pythonic。

while ticket1: # it is more pythonic
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            ticket1 = False

        keys = pygame.key.get_pressed()

        if keys[pygame.K_d]:
            c += 1

    # ...

    screen.fill((255, 250, 245))

    pygame.draw.rect(screen, color2, pygame.Rect(c, d, 50, 75))

    pygame.display.flip()

pygame.quit()

2 .--------------

if keys[pygame.K_d]: c += 1位于for event循环内部,因此只有在事件发生时才会调用 - 当鼠标移动时,按下键或“未按下”键时。将其移到for event循环之外。

while ticket1: # it is more pythonic
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            ticket1 = False

        keys = pygame.key.get_pressed()

    # outside of `for event` loop  
    if keys[pygame.K_d]:
        c += 1

    # ...

    screen.fill((255, 250, 245))

    pygame.draw.rect(screen, color2, pygame.Rect(c, d, 50, 75))

    pygame.display.flip()

pygame.quit()

有些人在没有get_pressed()

的情况下这样做
# clock = pygame.time.Clock()
move_x = 0

while ticket1 == True:

    # events

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            ticket1 = False

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                ticket1 = False

            elif event.key == pygame.K_d:
                move_x = 1

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_d:
                move_x = 0

    # variable modification

    c += move_x

    # ...

    # draws

    screen.fill((255, 250, 245))

    pygame.draw.rect(screen, color2, pygame.Rect(c, d, 50, 75))

    pygame.display.flip()

    # 60 FPS (Frame Per Second) to make CPU cooler

    # clock.tick(60)

pygame.quit()

BTW:使用pygame.time.Clock()在快速和慢速计算机上获得相同的FPS。没有FPS程序刷新屏幕每秒钟的时间,所以CPU忙碌而且很热。

如果您使用FPS,则必须添加c更大的值才能获得与之前相同的速度。

答案 1 :(得分:-2)

我有同样的错误

event.type == 256

为我工作