Когда я выхожу из программы у меня пишет "Python не отвечает."

def start_sound(sound):
    filename = sound
    chunk = 1024
   
    wf = wave.open(filename, 'rb')
    p = pyaudio.PyAudio()

    stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
                    channels = wf.getnchannels(),
                    rate = wf.getframerate(),
                    output = True)

    data = wf.readframes(chunk)

    while data != '':
        stream.write(data)
        data = wf.readframes(chunk)

    stream.close()
    p.terminate()

pygame.init()
screen = pygame.display.set_mode((1069, 800))
pygame.display.set_icon(pygame.image.load("assets\img\icon.png"))
bg = pygame.image.load("assets/img/bg.jpg")#.convert()
pygame.display.set_caption("PvZ remake edition")
screen.blit(bg, (0, 0))

def game_loop():
    while True:    
        for e in pygame.event.get():
            # если нажали на крестик
            if e.type == pygame.QUIT:
                raise SystemExit("QUIT")

        pygame.display.update()

def music():
    start_sound("assets/sound/Music.wav")

thread1 = Thread(target=game_loop)
thread2 = Thread(target=music)

thread2.start()
thread1.start()
thread2.join()
thread1.join()

Я использую модули pyaudio, pygame и threading. Работаю в визуал студио код. Скрин:скриншот программы "Не отвечает".


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Сделайте демоном нить, которая играет музыку. Тогда её не нужно будет останавливать при выходе из программы.

...
thread2 = Thread(target=music, daemon=True)

thread2.start()
thread1.start()
# thread2.join()
thread1.join()

P.S. Выполнять game_loop в выделенной нити нет смысла. Возможно, это задел на будущее, но в текущей конфигурации проще вызвать его в основном потоке.

→ Ссылка