Простая программа Pygame для проверки отображения зависает

Может ли кто-нибудь с большим опытом, чем я, дать мне понять, почему следующий код замораживает (вешает) окно? Все, что он должен делать, это отображать красный экран и обновлять 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()

person Paul Duncan    schedule 18.12.2012    source источник


Ответы (1)


Внутри класса Game вы объявляете runGame вне функции __init__ и не указываете self.runGame для замедления. Вы также обновляете FPS только при первом создании объекта Game, поэтому он останется на том же значении.

Исправьте это:

  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()
person DeadChex    schedule 18.12.2012
comment
Я внес вашу правку, и спасибо за это, это более согласованно, но окно все еще зависает для меня. В этом случае я должен принудительно выйти из него, и это вообще не позволит мне перемещать окно. Он просто остается замороженным. - person Paul Duncan; 18.12.2012
comment
Это может быть потому, что у вас нет обработки событий, но я не на 100% в этом - person DeadChex; 18.12.2012
comment
Хм, это могло быть так. Я влеплю и посмотрю! ... Вот и все. Спасибо DeadChex! - person Paul Duncan; 18.12.2012
comment
Дай мне знать, как дела, я здесь, чтобы помочь - person DeadChex; 18.12.2012
comment
Обновил OP с некоторым кодом события, теперь работает! Спасибо за помощь - person Paul Duncan; 18.12.2012
comment
Нет проблем, я изменю код ответа, чтобы отразить изменение кода. РЕДАКТИРОВАТЬ: изменено - person DeadChex; 18.12.2012