当前位置: 首页 > 知识库问答 >
问题:

检查一首歌是否以pyplay结尾

阎德宇
2023-03-14

我试图创建一个MP3播放器与Tkinter和PyGame(它的音乐模块)。我已经写了一个方法来检查歌曲是否已经播放完毕,但问题是程序本身在其中循环,我不知道如何以不同的方式实现它。还有别的办法吗?

    self.SONG_END = pygame.USEREVENT
    pygame.mixer.music.set_endevent(self.SONG_END)

    def __wait_for_song_to_end(self):
        while True:
            for event in pygame.event.get():
                if event.type == self.SONG_END:
                    self.__queue_song()
                    self.__set_new_selection() #works with listbox
                    break

更新的
以下是相关方法的代码:

    # Gets called when the 'play' button gets pressed
    def play_song(self):
        if not pygame.mixer.music.get_busy() and self.isPaused:
            pygame.mixer.music.unpause()
            self.isPaused = False
            self.btn_pause.config(image=self.img_pause)
            return

        if len(self.playlist.songsFullPath) > 0:
            # Getting song's full path
            for path in self.playlist.songsFullPath:
                if path.find(self.playlist.songsList.get(tk.ACTIVE)) != -1:
                    self.playlist.currentSongName = path
                    self.playlist.currentSongIndex = self.playlist.songsList.curselection()[0]
                    break

            # Loading the song into the mixer
            pygame.mixer.music.load(self.playlist.currentSongName)

            # Playing the song
            pygame.mixer.music.play(loops=0)
            self.songIsLoaded = True

    def __queue_song(self):
        if self.isOnRepeat:
            pygame.mixer.music.queue(self.playlist.currentSongName)
            return

        if self.playlist.songsListSize > 1 and self.playlist.currentSongIndex < self.playlist.songsListSize - 1:
            queuedSong = self.playlist.songsFullPath[self.playlist.songsList.curselection()[0] + 1]
            self.playlist.currentSongIndex += 1
            pygame.mixer.music.queue(queuedSong)

共有2个答案

邢鸿博
2023-03-14

我建议阅读Tkinter了解主循环。

不要等待歌曲结束,不断检查歌曲是否结束。在主循环中添加一个事件循环,并在SONG\u END事件发生时设置一个状态变量:

song_end = False

在主回路中:

for event in pygame.event.get():
    if event.type == self.SONG_END:
        song_end = True

if song_end:
    # [...]
班宏毅
2023-03-14

您可以做的是,使用root调用函数。after(),因此该函数会在歌曲结束时持续检查。

import pygame 

# Same codes and imports
root = Tk() # Don't forget this
pygame.init() # Use this instead of pygame.mixer.init() as you need event
...

def check_event():
    for event in pygame.event.get():
        if event.type == MUSIC_END:
            play() # In your case, run self.__queue_song() and self.__set_new_selection()
    root.after(100,check_event) # Repeat this function every 0.1 second

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

play() # Play the first random song
check_event() # Start checking for the end of song

如果你能提供更相关的代码,那么我可以举一个更好的例子。现在,您应该能够重写它以适应您的代码。

 类似资料:
  • 问题内容: 我想从表中查询具有元音作为其第一个和最后一个字符的名称列表。结果不能包含重复项。 为此,我编写了一个查询,该查询具有25个条件,每个元音每个其他元音,这非常笨拙。有更好的方法吗? 问题答案: 您可以使用正则表达式:

  • 问题内容: 我想知道一个类是否为枚举,但是我想我缺少了一些东西: 它给我一个错误,指出Enum.class无效。那么,如何检查类是否为枚举?我很确定有可能确定这一点,但我无法做到。 谢谢 问题答案: 正确的语法为: 但对于枚举,这是一种更方便的方法: 更新:对于带有主体的枚举项(例如,覆盖方法),这实际上将不起作用。在这种情况下,请使用 参考:

  • 问题内容: 我想创建一个函数来检查字符串的首字母是否大写。到目前为止,这是我想出的: 当我尝试运行它时,出现此错误: 有人可以看看并告知我在做什么错吗? 问题答案: 为什么不使用;

  • 我很难让这东西工作。基本上,一旦我单击用户配置的删除按钮,这个函数就会被调用。用户可以有多个配置。发生的情况是,一旦我删除了一个配置,它会寻找另一个配置,如果找到了,它会将其设置为当前配置文件。第一位工作正常,但如果返回什么,而不是输入它返回我一个错误... 代码: 错误: 请记住,我对Laravel和整个MVC环境非常陌生。

  • 编写以下代码的pythonic方式是什么? 我有一个模糊的记忆,即循环的显式声明可以避免,并且可以在条件中编写。这是真的吗?

  • 问题内容: 我知道我可以这样做: 然后只需编写语句中所需的代码。 还有其他方法可以检查它们是否相等? 问题答案: 怎么了 if(!Arrays.equals(array1,array2)) 与相同,即是同一数组。这不是大多数人期望的。 比较数组的内容。