再说一遍,这是我的代码,为什么在我启动应用程序时播放“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/