random.choice returns 按下按钮时相同的文件

random.choice returns the same file on button press

对于我的第一个项目,我正在使用 Raspberry Pi 作为基础构建音板。我想要几个按钮,每个按钮在每次按下时播放来自不同列表的随机声音文件。

我正在使用几个内置库,特别是 pygame、glob、random 和 Button 来简化操作。 Glob 用于生成可能要播放的文件列表,random 用于选择其中一个。

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。

不过,它正在做的是从列表中随机选择一个文件,然后在印刷机上播放它。当我重新启动并再次 运行 代码时,会选择一个不同的文件,因此我知道列表被正确显示。

我是不是漏掉了一些非常明显的东西?我应该使用不同的方法吗?我只是迷路了。

这一行

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');这将允许您 add/remove 文件而无需关闭 Python 程序,因为它会在每次按下按钮时进行新的文件系统搜索。

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