如何在不停止程序其余部分的情况下在python中进行延迟

如何在不停止程序其余部分的情况下在python中进行延迟,python,tkinter,Python,Tkinter,我正在重新设计一个程序,基本上是按命令播放声音。我正试图找到一种方法来洗牌的歌曲列表。我对应该发生的事情有基本的想法,但我似乎找不到一个可行的方法 我试过像“time.sleep(1)”和“.after(毫秒,函数)”这样的东西 我想让它播放歌曲列表中的随机歌曲,直到按下“停止”按钮(代码中未显示停止按钮)只是给您一些开始的地方。这将从列表中随机为您提供一首歌曲 songlist = ['a', 'b', 'c'] def shuffle(): while True:

我正在重新设计一个程序,基本上是按命令播放声音。我正试图找到一种方法来洗牌的歌曲列表。我对应该发生的事情有基本的想法,但我似乎找不到一个可行的方法

我试过像“time.sleep(1)”和“.after(毫秒,函数)”这样的东西


我想让它播放歌曲列表中的随机歌曲,直到按下“停止”按钮(代码中未显示停止按钮)

只是给您一些开始的地方。这将从列表中随机为您提供一首歌曲

 songlist = ['a', 'b', 'c']

 def shuffle():
      while True:
          for s in songlist:
              song=random.choice(s)

              print(song)

 if __name__ == '__main__':
      shuffle()

您可以尝试的一件事是使用线程。因此,首先导入线程模块:

Python2.7: from thread import start_new_thread

Python3.x: import threading
然后,您只需调用您希望与等待函数“并行”运行的方法,在您的示例中为“playSong”-方法:

Python2.7:
start\u new\u线程(playSong,())

Python3.x:

t = threading.Thread(target=playSong)
t.start()

我不懂你的代码。你为什么一直无缘无故地说废话?你为什么要拖延?你需要在哪里进行延迟?当我洗牌时,它播放的歌曲非常好。但是它在一个while循环中,这意味着它将循环回来,播放另一首歌曲,这将阻止当前歌曲播放-这就是为什么我认为需要延迟的原因。另外,我洗牌了两次,因为我在测试东西-当使用.after函数时,它说参数必须是.after(毫秒,函数),这就是为什么我在after中放了另一个winsound/song来看看它是否有效。你的整个架构都错了。使用线程很容易解决问题,但还会出现大量其他问题。我强烈建议您使用Pygame混音器来播放歌曲。在做任何进一步的事情之前,我也建议你在课堂上学习一点。使用“音乐播放器”创建类,您将从GUI控制该类。在这样的循环和线程中放置2只会导致您在同一主题上遇到新问题。。。因为你的GUI根本不会处理它,所以这会将一个随机项(在本例中是a、b或c)分配给“歌曲”3次?它会这样做,因为歌曲列表中有3个项目,并且您使用了for循环。“名称”和“主要”是什么意思?我见过它们被使用,但我不知道它们是做什么的。这将从列表中随机打印一个项目,打印次数与您停止脚本的次数相同(注意,您使用的是True)。现在它有3个项目可供选择,这就是限制。因此,无论何时,只要您想遍历一个列表,就应该使用for循环。if name==name部分(简而言之)是用来执行代码的-在本例中,shuffle()您应该查看它以获得更详细的解释-哦!好的,我现在明白了这一点,我可能会在我的代码中使用它,但是如果“打印(歌曲)”被播放音频的东西所取代,比如“winsound.PlaySound(歌曲,winsound.SND_ASYNC)”,它将如何工作呢?我是否仍然需要找出一种方法来延迟播放下一首歌曲,直到当前歌曲播放完毕?或者这就解决了吗?它应该一首接一首地执行这首歌。所以它会等到第一个完成,然后移动到下一个哦,太棒了,太完美了。虽然我正在使用tkinter并希望它只需点击一个按钮即可播放,但我只是将按钮上的“command”参数设置为“shuffle()”,还是需要“main”和“name”?我并不完全理解线程的概念。你能解释一下吗?另外,我从中了解到,我可以将每首歌曲分配给一个线程,并将线程放入列表中?这就是我的意思:不,不要将它们存储在一个列表中,所以你应该像对待methodcaller一样对待线程,让你运行一个方法“parallel”,这样你就可以在主线程中等待,在另一个线程中播放歌曲。因此,您选择一首歌曲,创建一个线程,在新线程上运行playsong方法,并等待主线程一段时间,然后通过创建一个新线程播放下一首歌曲,旧线程将在第一首歌曲的playsong方法结束时自行删除它,那么我如何将其实现为类似于此的东西呢?我想使用该链接中定义的PlaySong函数。如果造成混淆,很抱歉,但我会将我正在重写的整个程序发送给您,以便您了解它的工作原理。在运行该程序之前,请注意它非常混乱,因为这是我的第一个程序,整个“URL”从未完成,但应该是歌曲引用。所以我假设问题是winsound.PlaySound方法被阻塞,所以您无法执行gui操作,对吗?
t = threading.Thread(target=playSong)
t.start()