如何绑定.kv文件上的按钮以使其播放声音?

时间:2017-02-24 11:02:32

标签: python kivy

Hello StackOverflow社区, 我想要求一些帮助,因为我之前做了很长时间的研究,但没有找到任何帮助我。

我有一个学校项目,我决定使用Kivy为跨平台编写Python代码。我的项目是关于SoundBox的,为了简化我需要首先创建按钮并将它们绑定以播放各种声音。在纯python代码(没有.kv文件)上,我学会了如何绑定按钮以使其播放声音,因此我决定进入下一个级别,即屏幕管理部分。我有点学会了使用现在的.kv文件来简化它但我仍然坚持使用.kv文件绑定按钮。

我尝试了一些东西,但总是在控制台上出现错误(但现在不是很重要),我的Fade Transition不起作用。 非常感谢您的帮助,提前谢谢。

的.py:

from kivy.app import App
from kivy.uix.button import Button
from kivy.core.audio import SoundLoader
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition

sound = SoundLoader.load('Sunset_Lover.ogg')
sm = ScreenManager()

class ScreenManager(ScreenManager):
    pass

class Menu(Screen):
    pass

class Genre(Screen):
    pass

class TestApp(App):
    def build(self):
        sm.add_widget(Menu(name='menu'))
        sm.add_widget(Genre(name='genre'))
        return sm
    def son(self, instance):
        if sound:
            sound.play()

if __name__ == "__main__":
    TestApp().run()

.kv:

#: import FadeTransition kivy.uix.screenmanager.FadeTransition

<ScreenManager>:
    FadeTransition:
    Menu:
    Genre:
<Menu>:
    BoxLayout:
        Button:
            text: "Commencer"
            size_hint: 1, 1
            pos_hint: {'x': 0.3, 'y':0.3}
            on_press: root.manager.current = 'genre'
<Genre>:
    BoxLayout:
        Button:
            text: "Exemple1"
            size_hint: 0.2, 0.2
            pos_hint: {'x': 0.2, 'y':0.2}
            on_press: root.son()

2 个答案:

答案 0 :(得分:0)

问题是你在kv文件中可以使用的任何范围都有sound。首先,将其移动到可以访问它的位置:

class TestApp(App):
    def build(self):
        self.sound = SoundLoader.load('file')
        sm = ScreenManager()
        sm.add_widget(Menu(name='menu'))
        sm.add_widget(Genre(name='genre'))
        return sm

然后以更有效的方式收集参数 - 这样你就可以在kv和python中使用它,并且会收集额外的args(不会抛出错误)

    def son(self, *args):
        if self.sound:
            self.sound.play()

然后在kv中,您必须确保ScreenManager仅收到相应的小部件,即仅Screen。要使转换有效,您必须将其添加到变量used from

<ScreenManager>:
    transition: FadeTransition()
    Menu:
    Genre:

要实际播放声音(运行方法),您可以从您定义它的位置(即App实例)调用它:

<Genre>:
    BoxLayout:
        Button:
            text: "Exemple1"
            size_hint: 0.2, 0.2
            pos_hint: {'x': 0.2, 'y':0.2}
            on_press: app.son()  # here

答案 1 :(得分:0)

您可以将其导入kv文件:

#: import sound __main__.sound

Button:
    on_release: sound()