我再次,这是我的代码,为什么" 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()
答案 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
时缺少括号。按下按钮后会调用它。