Как я могу заставить одну кнопку воспроизводить музыку, приостанавливать музыку и снимать паузу с музыки в Python с помощью tkinter и pygame?

#python #tkinter #audio #pygame

#python #ткинтеръ #Аудио #пигмея #tkinter #pygame

Вопрос:

Мне удалось заставить программу воспроизводить музыку только при нажатии кнопки. Все, что я пытался сделать паузу или остановить музыку, заканчивалось неудачей. Я чувствую, что должен использовать оператор 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)
  

Комментарии:

1. Может быть, вы можете переключить состояние? Например, если воспроизведение является логическим, playing = not playing

Ответ №1:

Используйте текст кнопки проверки с условием 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()
  

Комментарии:

1. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение того, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и более высокого качества и с большей вероятностью привлекут положительные отзывы

Ответ №2:

Вот пример.

 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 arguments: expression . task Значение меняется каждый раз, когда нажимается кнопка.

Ответ №3:

Я использовал ваш код для создания этого примера. Он изменяет текст кнопки на основе ответа @ 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()
  

Комментарии:

1. Это работает безупречно, и это именно то, что я хотел сделать. Спасибо, что научили меня чему-то новому. Операторы if, которые я пробовал, не работали, потому что я не создал переменную для состояния воспроизведения музыки. Зачем мне нужна эта строка: mxstate = 3-mxstate? Я понимаю, что он делает, но я действительно не понимаю, как это работает.

2. @Slacker mxstate = 3-mxstate # swap pause state это не самый понятный способ справиться с этим. Вместо этого удалите эту строку и в конце if mxstate == 1: # music playing блока добавьте mxstate = 2 # set to paused state , а также в конце else: # music paused блока добавьте mxstate = 1 # set to playing state . Это то, что mxstate = 3-mxstate делает, переключаясь взад и вперед между mxstate 1 и 2 путем вычитания mxstate (1 или 2) из 3. Mike67, возможно, захочет уточнить эту часть ответа.