Skip to main content
 首页 » 编程设计

python之Pygame 简单程序测试显示卡住

2025年05月04日9xing901022

比我更有经验的人可以给我一些线索,说明为什么以下代码会卡住(挂起)窗口吗?它应该做的就是显示红色屏幕并在窗口名称中更新其 FPS。谢谢你! :)

import pygame 
from pygame.locals import * 
from pygame import Color 
 
 
class Game(): 
    """ Lets try to get this going by simple steps 
    One by one. First step, lets figure how to make a class 
    that can do the display stuff. Lord have mercy on my soul""" 
 
    runGame = True 
 
    def __init__(self, wi=256, hi=224, multii=3): 
        """Initialization""" 
        pygame.init() 
        self.width      = wi*multii 
        self.height     = hi*multii 
        self.spritesize = 16*multii 
        self.clock      = pygame.time.Clock() 
        self.fps        = self.clock.get_fps() 
        self.screen     = pygame.display.set_mode((self.width, self.height)) 
 
    def mainLoop(self): 
        """Loop through the main game routines 
        1. Drawing  2. Input handling  3. Updating 
        Then loop through it until user quits""" 
        while self.runGame: 
            self.clock.tick(12) 
            self.draw() 
            self.events() 
 
    def events(self): 
        """Time to handle some events""" 
        events = pygame.event.get() 
        for e in events: 
            print e 
            if (e.type == pygame.QUIT) or  
            (e.type == KEYDOWN and e.key == K_ESCAPE): 
                self.runGame = False 
 
    def draw(self): 
        """Draw and update the main screen""" 
        self.screen.fill(Color('red')) 
        pygame.display.set_caption('Grid2. FPS: '+str(self.fps)) 
        pygame.display.update() 
 
 
game = Game() 
game.mainLoop() 

请您参考如下方法:

在 Game 类中,您在 __init__ 函数之外声明了 runGame,并且没有将 self.runGame 用于减速。您也仅在首次创建 Game 对象时更新 FPS,因此它将保持相同的值。

通过以下方式解决此问题:

  1. 在初始化代码中移动runGame减速并使其成为self.runGame
  2. 添加更新 self.fps 的调用。我已经在draw函数下添加了它

所以你的结束代码应该是这样的(注释包含在我改变的地方):

import pygame 
from pygame.locals import * 
from pygame import Color 
 
 
class Game(): 
    """ Lets try to get this going by simple steps 
    One by one. First step, lets figure how to make a class 
    that can do the display stuff. Lord have mercy on my soul""" 
 
 
 
def __init__(self, wi=256, hi=224, multii=3): 
    """Initialization""" 
    pygame.init() 
    self.width      = wi*multii 
    self.height     = hi*multii 
    self.spritesize = 16*multii 
    self.clock      = pygame.time.Clock() 
    self.fps        = self.clock.get_fps() 
    self.screen     = pygame.display.set_mode((self.width, self.height)) 
    self.runGame = True # I've moved the runGame decleration 
 
def mainLoop(self): 
    """Loop through the main game routines 
    1. Drawing  2. Input handling  3. Updating 
    Then loop through it until user quits""" 
    while self.runGame: 
        self.clock.tick(12) 
        self.draw() 
        self.event() 
 
def events(self): 
    """Time to handle some events""" 
    events = pygame.event.get() 
    for e in events: 
        print e 
        if (e.type == pygame.QUIT) or  
        (e.type == KEYDOWN and e.key == K_ESCAPE): 
            self.runGame = False 
 
 
def draw(self): 
    """Draw and update the main screen""" 
    self.screen.fill(Color('red')) 
    self.fps = self.clock.get_fps() # I reupdate the FPS counter 
    pygame.display.set_caption('Grid2. FPS: '+str(self.fps)) 
    pygame.display.update() 
 
 
game = Game() 
game.mainLoop()