#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, возможно, захочет уточнить эту часть ответа.