我一直在尝试将主事件循环放在装饰器中,希望我的程序看起来更整洁。我有两个文件main.py
和event_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()
永远不会与装饰者一起使用吗?
答案 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()