PyGame似乎是从Ctrl-C拦截SIGINT

时间:2017-09-30 00:56:59

标签: python pygame

如果我试图使用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杀死程序?

1 个答案:

答案 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。