random.choice возвращает тот же файл при нажатии кнопки - PullRequest
4 голосов
/ 16 октября 2019

Для моего первого проекта я работаю над созданием деки с использованием Raspberry Pi в качестве основы. Я хотел бы иметь несколько кнопок, каждая из которых воспроизводит случайный звуковой файл из разных списков при каждом нажатии.

Я использую несколько встроенных библиотек, в частности, Pygame, Glob, Random и Button, чтобы сделать вещиПолегче. Glob используется для создания списка возможных файлов для воспроизведения, а случайный - для выбора одного из них.

pygame.init()

h = glob.glob('/file path/*.wav')

btn_0 = Button(2)

btn_0.when_pressed = pygame.mixer.Sound(random.choice(h)).play

Насколько я понимаю, это должно вызвать список всех файлов, заканчивающихсяв .wav из указанного пути к файлу и при нажатии кнопки случайным образом выберите один для воспроизведения через pygame.

Тем не менее, он случайным образом выбирает файл из списка и затем воспроизводит его напресс. Когда я перезагружаюсь и снова запускаю код, выбирается другой файл, и я знаю, что список виден правильно.

Я просто что-то упускаю из виду? Должен ли я использовать другой метод? Я просто потерян здесь.

1 Ответ

2 голосов
/ 16 октября 2019

Эта строка

btn_0.when_pressed = pygame.mixer.Sound(random.choice(h)).play

назначает один файл .when_pressed;это НЕ изменится на протяжении всего выполнения программы.

Вы пытались назначить функцию или lambda на .when_pressed, чтобы эта функция выполнялась при каждом нажатии кнопки? Может быть так:

h = glob.glob('/file path/*.wav')
btn_0.when_pressed = lambda: pygame.mixer.Sound(random.choice(h)).play()

Это работает? Я не могу проверить это прямо сейчас на моей машине.


Конечно, вы также можете создавать glob.glob('/file path/*.wav') с нуля при каждом нажатии кнопки;это позволит вам добавлять / удалять файлы, не закрывая программу Python, поскольку при каждом нажатии кнопки будет выполняться поиск новой файловой системы.

btn_0.when_pressed = lambda: pygame.mixer.Sound(
    random.choice(glob.glob('/file path/*.wav'))).play()
...