Tkinter, playsound, simpleaudio, pydub. Играет только один последний загруженный звук
При нажатии на кнопку, которая должна воспроизводить определенный звук она проигрывает не свой звук, а тот, что был загружен последним.
Я попробовал уже все библиотеки для воспроизведения звуков в Python но ни одна не работает как мне это надо.
playsound
from tkinter import *
import configparser
from os.path import abspath as wd
from playsound import playsound
def main():
#config part
config = configparser.ConfigParser()
config.read(f'{wd("")}/soap_config.ini')
#window part
window = Tk()
window.title(config["window"]["title"])
window.geometry(config["window"]["size"])
#construction func's part
def create_spc():
space = Label(window, text=' ')
space.pack(side=LEFT)
def create_btn(text, command):
create_spc()
btn = Button(window, text=text, command=command)
btn.pack(side=LEFT)
#buttons \w files part
btns_names = config["btns"]["names"].split("/-/")
btns_sounds = config["btns"]["sounds"].split("/-/")
sounds_folder = config["btns"]["folder"]
for n in range(0, 3):
create_btn(btns_names[n], lambda: playsound(f"{sounds_folder}/{btns_sounds[n]}.wav"))
window.mainloop()
if __name__ == "__main__":
main()
Остальные варианты меняют только импорты и часть после #buttons \w files part
simpleaudio
for s in range(0, len(btns_sounds)):
btns_sounds[s] = sa.WaveObject.from_wave_file(f"{sounds_folder}/{btns_sounds[s]}.wav")
for n in range(0, len(btns_names)):
create_btn(btns_names[n], lambda: btns_sounds[n].play())
pydub
for s in range(0, len(btns_sounds)):
btns_sounds[s] = AudioSegment.from_wav(f"{sounds_folder}/{btns_sounds[s]}.wav")
for n in range(0, len(btns_names)):
create_btn(btns_names[n], lambda: play(btns_sounds[n]))
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
...
for n in range(0, 3):
create_btn(
btns_names[n],
# ---------------> vvv ---------------------------------------> v
lambda i=n: playsound(f"{sounds_folder}/{btns_sounds[i]}.wav")
)
...