pygame.init()似乎没有在装饰器中调用

时间:2014-06-03 18:36:30

标签: python pygame decorator

我一直在尝试将主事件循环放在装饰器中,希望我的程序看起来更整洁。我有两个文件main.pyevent_loop_decorator.py

event_loop_decorator.py

import pygame


class EventLoop(object):
    def __init__(self, func):
        self.func = func
        pygame.init()
        print("pygame should have been initialised.")

    def __call__(self):
        while True:
            pygame.time.wait(50)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    break
            self.func()

main.py

import pygame
import event_loop_decorator


@event_loop_decorator.EventLoop
def while_in_event_loop():
    pass


if __name__ == "__main__":
    surface = pygame.display.set_mode((200, 100))
    surface.fill((255, 0, 0))
    pygame.display.flip()
    while_in_event_loop()

正如您所看到的,简单的程序只是为了显示一个200 * 100的红色窗口。它工作正常,退出窗口按钮似乎工作正常。但是在程序退出后,我得到以下输出和错误。

pygame should have been initialised.
Traceback (most recent call last):
  File "C:/Users/ray/Dropbox/Programming/Python/pygame_test/code/main.py", line 50, in <module>
    while_in_event_loop()
  File "C:\Users\ray\Dropbox\Programming\Python\pygame_test\code\event_loop_decorator.py", line 13, in __call__
    for event in pygame.event.get():
pygame.error: video system not initialized

Process finished with exit code 1

我们看到装饰器的构造函数中的print命令被调用,它是输出中的第一行。但是后来在输出中我们看到显然&#34;视频系统没有初始化&#34;。当我没有装饰器的时候,一切都很完美。顺便说一句,这是我第一次使用装饰器。

有任何帮助吗?我装饰师做错了吗? pygame.init()永远不会与装饰者一起使用吗?

1 个答案:

答案 0 :(得分:3)

如果您查看__call__功能,您会看到当您休息时,再次返回while循环。从函数返回将解决问题。

def __call__(self):
    while True:
        pygame.time.wait(50)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return
        self.func()