使用 pygame.mixer.music.get_endevent()

Joh*_*n_S 2 pygame event-handling python-3.x

我希望tkinter标签在音效完成后不显示任何内容。

我一直在研究如何创建/初始化/捕捉音乐事件的结束,但没有运气。

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)
Run Code Online (Sandbox Code Playgroud)

显然,play_btn 函数从列表中播放声音效果。

stop_btn函数提前停止音效并清除标签。

clear_label函数已为end_of_song事件做好准备而创建

fur*_*ras 5

您必须使用set_endevent()设置当音乐结束时它将发送到事件队列的值。

MUSIC_END = pygame.USEREVENT+1
pygame.mixer.music.set_endevent(MUSIC_END)
Run Code Online (Sandbox Code Playgroud)

然后你可以在事件循环中测试它

if event.type == MUSIC_END:
    print('music end event')
Run Code Online (Sandbox Code Playgroud)

当音乐结束时,它会打印文本 - 但当你停止或暂停它时,它不会打印文本。

顺便说一句:在 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()
Run Code Online (Sandbox Code Playgroud)

编辑:示例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()
Run Code Online (Sandbox Code Playgroud)