Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用tkinter和pygame使Python中的单个按钮播放音乐、暂停音乐和取消暂停音乐?_Python_Tkinter_Audio_Pygame - Fatal编程技术网

如何使用tkinter和pygame使Python中的单个按钮播放音乐、暂停音乐和取消暂停音乐?

如何使用tkinter和pygame使Python中的单个按钮播放音乐、暂停音乐和取消暂停音乐?,python,tkinter,audio,pygame,Python,Tkinter,Audio,Pygame,我只能在按下按钮时让程序播放音乐。我试图暂停或停止音乐的一切都以失败告终。我觉得我应该使用if语句来暂停当前正在播放的音乐,或者在没有播放的情况下取消暂停,但我需要了解正确的编写方法。这是正确的方法吗?我真的很想能够从一个按钮开始,暂停和取消暂停音乐,但我正在努力找出如何进行编码。这是我播放音乐的代码 def Play_music(): pygame.mixer.music.load('tavernsound.mp3') pygame.mixer.music.play()

我只能在按下按钮时让程序播放音乐。我试图暂停或停止音乐的一切都以失败告终。我觉得我应该使用if语句来暂停当前正在播放的音乐,或者在没有播放的情况下取消暂停,但我需要了解正确的编写方法。这是正确的方法吗?我真的很想能够从一个按钮开始,暂停和取消暂停音乐,但我正在努力找出如何进行编码。这是我播放音乐的代码

 def Play_music():
     pygame.mixer.music.load('tavernsound.mp3')
     pygame.mixer.music.play()
下面是按钮的代码:

btn11=Button(labelframe, text='Ambiance', width=14, bg='red', fg='black', command=Play_music)
btn11.pack(side=LEFT)
这里有一个例子

from tkinter import *

root = Tk()

def doSomething(task):
    global var, button
    if task == 0:
        var.set("Started Playing")
        button.configure(text = "Pause")
        button.configure(command = lambda task = 1: doSomething(task))
        #play
    elif task == 1:
        var.set("Paused")
        button.configure(text = "Resume")
        button.configure(command = lambda task = 0: doSomething(task))
        #pause

button = Button(root, text = "Play", command = lambda task = 0: doSomething(task))
button.pack()
var = StringVar()
label = Label(root, textvariable = var)
label.pack()

root.mainloop()

在这里,相同的按钮用于播放、暂停和恢复。我使用了
lambda
函数,该函数的语法为
lambda参数:expression
。每次单击按钮时,
任务
值都会更改。

我使用您的代码创建了这个示例。它根据@AST答案更改按钮文本:

from tkinter import *
import pygame

root = Tk()
root.title("MSC")

pygame.init()

mxstate = 0 # music play state

pygame.mixer.music.load('tavernsound.mp3')

def Play_music():
     global mxstate
     if mxstate == 0:  # music not started
         pygame.mixer.music.play()
         btn11.configure(text = "Pause")
         mxstate =  1
         return
        
     if mxstate == 1:  # music playing
         pygame.mixer.music.pause()
         btn11.configure(text = "Resume")
     else:  # music paused
         pygame.mixer.music.unpause()
         btn11.configure(text = "Pause")
     mxstate = 3-mxstate  # swap pause state
     
btn11=Button(root, text='Ambiance', width=14, bg='red', fg='black', command=Play_music)
btn11.pack(side=LEFT)

root.mainloop()

将复选按钮文本与if条件一起使用

示例:

from tkinter import Tk, Button
from pygame import mixer

root = Tk()
root.title("Play Music")
root.geometry('350x200')

mixer.init()
mixer.music.load("sound.mp3")

def play_music():
    if button["text"] == "Play":
        button["text"] = "Pause"
        button["bg"] = "red"
        mixer.music.play()
    else:
        button["text"] = "Play"
        button["bg"] = "green"
        mixer.music.pause()

button = Button(root, text='Play', width=14, bg='green', fg='black', command=play_music)
button.pack()

root.mainloop()

也许你可以切换状态?就像如果播放是一个布尔值,
playing=不播放
,它可以完美地工作,这正是我想要做的。谢谢你教我新东西。我尝试的if语句无效,因为我没有为音乐播放状态创建变量。为什么我需要这行:mxstate=3-mxstate?我知道它在做什么,但我真的不明白它是如何工作的。@Slacker
mxstate=3-mxstate#swap pause state
并不是最清楚的处理方法。相反,如果mxstate==1,则删除该行并在
末尾添加
mxstate=2,设置为暂停状态
,并且在
的末尾也删除该行:#音乐暂停
块添加
mxstate=1#设置为播放状态
。这就是
mxstate=3-mxstate
所做的,通过从3中减去mxstate(1或2),在mxstate的1和2之间来回交换。Mike67可能想澄清答案的这一部分。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票