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

时间:2014-09-11 22:47:41

标签: python audio kivy

我再次,这是我的代码,为什么" beep.wav"当我启动应用程序时播放而不是按下按钮时我认为我已将其绑定到?

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()

1 个答案:

答案 0 :(得分:3)

  

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

这一行调用函数,就像你在使用函数调用语法时总是期望的那样 - 你调用sound.play(),因此调用函数并听到声音。 bind方法对此没有任何了解,它只能看到函数的返回值,可能只是None

我认为在这种情况下你需要的是像

这样的东西
btn.bind(on_press=lambda *args: sound.play())

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

您通常可以这样做:

def some_function(*args):
    print('the button was pressed!')

...

btn.bind(on_press=some_function)

请注意,实际调用some_function时缺少括号。按下按钮后会调用它。