如果我试图使用PyGame使屏幕变黑,PyGame似乎拦截了SIGINT,我无法使用control-C退出程序。如果我将代码简化为最基本的部分,它看起来像这样:
import signal
import time
import pygame
class Foo:
def __init__(self):
self.bgcolor = [0,0,0]
pygame.display.init()
pygame.font.init()
pygame.mouse.set_visible(False)
size = (pygame.display.Info().current_w, pygame.display.Info().current_h)
self.screen = pygame.display.set_mode(size, pygame.FULLSCREEN)
self.blank_screen()
def blank_screen(self):
self.screen.fill(self.bgcolor)
pygame.display.update()
#pygame.quit()
def sighandle(self, signal, frame):
print('I got a ctrl-c')
self.close()
def close(self):
print('calling close')
pygame.quit()
def run(self):
print('I am running')
time.sleep(10)
if __name__=='__main__':
bar = None
try:
bar = Foo()
signal.signal(signal.SIGINT, bar.sighandle)
signal.signal(signal.SIGTERM, bar.sighandle)
bar.run()
finally:
print('in finally block')
if bar is not None:
bar.close()
如果删除pygame部分,ctrl-c按预期工作,并打印sighandle()
的消息。当我将pygame部分放入时,屏幕会按预期空白,但忽略ctrl-c,并且永远不会打印sighandle()
的消息。代码刚刚运行完成。此外,如果我取消注释pygame.quit()
中已注释的blank_screen()
,ctrl-c会再次显示,但当然黑屏会消失。
当我调用PyGame时,为什么代码忽略ctrl-c,我如何让它按预期工作,以便ctrl-c通过sighandle
杀死程序?
答案 0 :(得分:0)
经过一番研究,我发现设计确实如此。但是,我没有在PyGame的文档中明确提到它。
通过将其作为事件处理,可以在上面的代码中启用Ctrl-C。我可以修改Foo.run()
:
def run(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.sighandle()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_c and pygame.key.get_mods() & pygame.KMOD_CTRL:
print "pressed CTRL-C as an event"
self.sighandle()
print('I am running')
time.sleep(10)
我从Adafruit's VideoLooper获取了基于PyGame的屏幕消隐代码,其中还包括基于信号库的SIGINT处理。但是,我不认为他们的代码会按原样处理Ctrl-C。