簡體   English   中英

PyGame似乎正在從Ctrl-C攔截SIGINT

[英]PyGame seems to be intercepting SIGINT from Ctrl-C

如果我嘗試使用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殺死程序?

經過研究,我發現確實是這種情況。 不過,我沒有在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的VideoLooper中獲取了基於PyGame的屏幕空白代碼,該代碼還包括基於信號庫的SIGINT處理。 但是我也不認為他們的代碼也可以按原樣處理Ctrl-C。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM