Использование pygame.mixer.music.get_endevent () - PullRequest
0 голосов
/ 30 октября 2019

Я хочу, чтобы лейбл tkinter не показывал ничего, когда звуковой эффект закончился.

Я безуспешно исследовал www, как создать / инициализировать / поймать музыкальное событие в конце.

def play_btn():

    if mixer.music.get_busy():

         mixer.music.fadeout(1000)

    snd_fyl.set(snd_list.get(ACTIVE))
    mixer.music.load(snd_dir+"/"+snd_list.get(ACTIVE)+"mp3")
    mixer.music.play()

def stop_btn():

    mixer.music.stop()

    clear_label()

def clear_label():

    snd_fyl.set("")

snd_lbl1 = LabelFrame(MainWindow, text="Sound effect playing", labelanchor=N)


snd_playing_lbl = Label(snd_lbl1, width=40, textvariable=snd_fyl)

Очевидно, что функция play_btn воспроизводит звуковой эффект из списка.

Функция stop_btn преждевременно останавливает звуковой эффект и очищает метку.

Функция clear_label была создана для готовности к событию end_of_song

1 Ответ

0 голосов
/ 06 ноября 2019

Вы должны использовать set_endevent(), чтобы установить значение, которое будет отправлено в очередь событий после завершения музыки.

MUSIC_END = pygame.USEREVENT+1
pygame.mixer.music.set_endevent(MUSIC_END)

И затем вы можете проверить его в цикле событий

if event.type == MUSIC_END:
    print('music end event')

Он будет печатать текст, когда музыка закончится, но не тогда, когда вы остановите или приостановите ее.

Кстати: в Linux я вижу этот текст за несколько миллисекунд до того, как он заканчивает воспроизводить музыку.


Полный рабочий пример - но без tkinter

import pygame

pygame.init()

screen = pygame.display.set_mode((400, 300))

MUSIC_END = pygame.USEREVENT+1
pygame.mixer.music.set_endevent(MUSIC_END)

pygame.mixer.music.load('sound.wav')
pygame.mixer.music.play()

running = True
while running:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == MUSIC_END:
            print('music end event')

        if event.type == pygame.MOUSEBUTTONDOWN:
            # play again
            pygame.mixer.music.play()

pygame.quit()

РЕДАКТИРОВАТЬ: Пример с tkinter

import pygame
import tkinter as tk

def check_event():
    for event in pygame.event.get():
        if event.type == MUSIC_END:
            print('music end event')
            label['text'] = ''

    root.after(100, check_event)

def play():
    label['text'] = 'playing'
    pygame.mixer.music.play()

# --- main ---

pygame.init()    

MUSIC_END = pygame.USEREVENT+1
pygame.mixer.music.set_endevent(MUSIC_END)
pygame.mixer.music.load('sound.wav')

root = tk.Tk()

label = tk.Label(root)
label.pack()

button = tk.Button(root, text='Play', command=play)
button.pack()

check_event()
root.mainloop()

pygame.quit()
...