利用pygame.mixer.music.get_endevent()

时间:2019-10-30 17:21:05

标签: python-3.x pygame event-handling

我希望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 :(得分:0)

您必须使用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()