python - Kivy Buttons - 在执行时播放声音,而不是在点击时播放

标签 python audio kivy

再说一遍,这是我的代码,为什么在我启动应用程序时播放“beep.wav”,而不是在按下我认为绑定(bind)到的按钮时播放?

import kivy
import random
from kivy.core.audio import SoundLoader
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout

sound = SoundLoader.load('beep.wav')

red = [1,0,0,1]
green = [0,1,0,1]
blue =  [0,0,1,1]
purple = [1,0,1,1]

class A_Cool_Program(App):
    def Orientation(self, orient):
        self.orient = orient

    def build(self):
        layout = BoxLayout(padding=0, orientation=self.orient)
        colors = [red, green, blue, purple]

        for i in range(5):
            btn = Button(text="Test Button %s" % (i+1), background_color=random.choice(colors))
            layout.add_widget(btn)
            sound = SoundLoader.load('beep.wav')
            btn.bind(on_press=sound.play())
        return layout

if __name__ == "__main__":
    app = A_Cool_Program()
    app.Orientation(orient="vertical")
    app.run()

最佳答案

btn.bind(on_press=sound.play())



这一行调用函数,正如您在使用函数调用语法时所期望的那样 - 您调用了 sound.play() ,因此调用该函数并且您会听到声音。 bind方法不知道这些,它只看到函数的返回值,可能只是 None .

我认为在这种情况下,您需要类似的东西
btn.bind(on_press=lambda *args: sound.play())

这会传入一个 lambda 函数,当调用该函数时,sound.play()正在运行。这个例子实际上是不寻常的,因为 sound.play似乎不接受任何参数,但 kivy 绑定(bind)至少会自动传递按钮的实例,所以这段代码使用 lambda 函数来吃那个参数。

你通常可以这样做:
def some_function(*args):
    print('the button was pressed!')

...

btn.bind(on_press=some_function)

请注意实际调用 some_function 时缺少括号。 .稍后按下按钮时将调用它。

关于python - Kivy Buttons - 在执行时播放声音,而不是在点击时播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25798159/

相关文章:

python - ValueError : could not broadcast input array from shape (20, 590) 变成形状 (20)

python - 使用 Python 处理 CSV 中的非标准美式英语字符和符号

algorithm - 实时心律检测

cocoa-touch - 播放时如何处理ipod库音频文件原始数据

python - Kivy 不检测 OpenGL 2.0

python - 用kivy按下按钮时如何更改空格?

python - 标准化 : how to avoid zero standard deviation

python - 如何在 python 中读取一个大的 tif 文件?

c# - 在C#Visual Studio中连续录制和播放音频

python - 如何为 python kivy 绘画应用程序添加一个清除按钮