Изменяя ответ Алекса, обратите внимание, что вы, вероятно, хотите сделать это для всех исключений, чтобы обеспечить отключение потока в случае сбоя основного потока по любой причине, а не только по KeyboardInterrupt.
Вам также нужно переместить обработчик исключений, чтобы избежать условий гонки. Например, при вызове stopEvent.isSet () может быть KeyboardInterrupt.
try:
t = Thread(target=update)
t.start()
while not stopEvent.isSet():
for event in pygame.event.get():
if event.type == pygame.QUIT:
stopEvent.set()
finally:
stopEvent.set()
Выполнение этого в конечном итоге проясняет ситуацию: вы можете сразу сказать, что событие всегда будет установлено независимо от того, как вы выйдете из этого блока кода. (Я предполагаю, что установка события дважды безвредна.)
Если вы не хотите показывать трассировку стека в KeyboardError, вы должны перехватить ее и проглотить, но убедитесь, что делаете это только в самом внешнем коде, чтобы исключение распространялось полностью.