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")
        )
...
→ Ссылка