python - kivy随机屏幕显示

标签 python python-3.x audio kivy

我正在尝试制作一个应用程序,实际上是一个游戏,当触摸“下一步”按钮时,它会显示随机屏幕,所以我制作了要在每个屏幕上显示的屏幕和标签,但我无法让它显示当触摸“下一步”按钮时随机屏幕,它只是遵循一种模式,有人会在这里帮助我吗?代码如下:

#: import FadeTransition kivy.uix.screenmanager.FadeTransition
#: import Image kivy.uix.image.Image
#: import SoundLoader kivy.core.audio.SoundLoader


ScreenManagement:

    transition: FadeTransition()

    MainScreen:

    GameScreen:

    GameScreen2:

    GameScreen3:

    GameScreen4:


<Button>:

    font_size: 12
    size_hint: 0.2, 0.1

<MainScreen>:


    name: "main"

    FloatLayout:

    Button:

        text: "START GAME"
        color: 1,0,1,1
        pos_hint: {"x": 0, "y":0}
        on_release: app.root.current = "game"

    Button:

        text: "QUIT"
        color: 1,0,0,1
        pos_hint: {"x": .8, "y": 0}
        on_release: quit()

    Button:
        text: "SOUND"
        color: 0,1,0,1
        pos_hint: {"x":.2 , "y": .4}
        on_press: app.play_sound1()

<GameScreen>:
    name: "game"

    FloatLayout:
        Label:
            text: "Python\nSnowden\nMr.Robot"
            font_size: 40
            color: 0,1,0,1
            pos_hint: {"x":0, "y": 0}


    Button:

        text: "Home"
        on_release: app.root.current = "main"
        color: 1,0,0,1
        pos_hint: {"right":1, "top":1}

    Button:

        text: "Next"
        on_release: app.root.current = "game2"
        color: 0,1,0,1
        pos_hint: {"x":0, "y":0}

<GameScreen2>:
    name: "game2"

    FloatLayout:

        Label:
            text: "Banana\n\nOrange\n\nTea\n\nSleep"
            font_size: 40
            color: 0,1,0,1
            pos_hint: {"x":0, "y": 0}

    Button: 

        text: "Home"
        on_release: app.root.current = "main"
        color: 1,0,0,1
        pos_hint: {"right":1, "top":1}

    Button:

        text: "Next"
        on_release: app.root.current = "game3"
        color: 0,1,0,1
        pos_hint: {"x": 0, "y": 0}

<GameScreen3>:
    name: "game3"

    FloatLayout:

        Label:
            text: "Assembly\n\nRuby\n\nC"
            font_size: 40
            color: 0,1,0,1
            pos_hint: {"x":0, "y":0}

    Button: 

        text: "Home"
        on_release: app.root.current = "main"
        color: 1,0,0,1
        pos_hint: {"right":1, "top":1}

    Button:

        text: "Next"
        on_release: app.root.current = "game4"
        color: 0,1,0,1
        pos_hint: {"x": 0, "y": 0}

<GameScreen4>:
    name: "game4"

    FloatLayout:

        Label:
            text: "Prolog\n\nPygame\n\nC++"
            font_size: 40
            color: 0,1,0,1
            pos_hint: {"x":0, "y":0}

    Button: 

        text: "Home"
        on_release: app.root.current = "main"
        color: 1,0,0,1
        pos_hint: {"right":1, "top":1}

上面是 kv 代码,对于 kivy 的业余爱好者造成的困惑表示抱歉 这是 python 端代码:

from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.core.audio import SoundLoader
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition

class MainScreen(Screen):
    pass

class GameScreen(Screen):
    pass

class GameScreen2(Screen):
    pass

class GameScreen3(Screen):
    pass

class GameScreen4(Screen):
    pass

class ScreenManagement(ScreenManager):
    pass

presentation = Builder.load_file("quora.kv")

class MainApp(App):

    def build(self):

        self.load_sounds()

        return presentation

    def load_sounds(self):
        self.sounds = {}
        for i in range(10):
            fname = 'sound' + str(i+1) + '.wav'
            self.sounds[i] = SoundLoader.load(fname)

    def play_sound1(self):
        sound = self.sounds.get(0)
        if sound is not None:
            sound.volume = 0.5
            sound.play()

    def play_sound2(self):
        sound = self.sounds.get(1)
        if sound is not None:
            sound.volume = 0.5
            sound.play()


if __name__ == "__main__":

    MainApp().run()

这是我为你制作的示例,因为原始的比这个大得多,我不知道如何使用某种循环来生成屏幕,所以我在原始代码上制作了超过 20 个屏幕,如果你可以的话帮我弄清楚当我点击“开始”按钮时如何停止菜单歌曲,以便我可以点击屏幕 1 上的“歌曲”按钮来播放其歌曲,我将不胜感激。感谢您的耐心等待。

最佳答案

触摸“NEXT”按钮时显示随机屏幕

使用screen_names

screen_names

List of the names of all the Screen widgets added. The list is read only.

screens_names is an AliasProperty and is read-only. It is updated if the screen list changes or the name of a screen changes.

片段

#:import choice random.choice
...

    Button:

        text: "Next"
        on_release: 
            root.manager.current = choice(root.manager.screen_names[1:])
        color: 0,1,0,1
        pos_hint: {"x":0, "y":0}

停止/播放音乐

您可能想使用 ToggleButton而不是播放音乐的按钮。请引用下面的例子。

示例

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.togglebutton import ToggleButton
from kivy.core.audio import SoundLoader
from kivy.properties import ObjectProperty


class MusicScreen(Screen):
    enter = ObjectProperty(None)
    text_input = ObjectProperty(None)
    stop = ObjectProperty(None)
    musicbutton = ToggleButton()


class ScreenManagement(ScreenManager):
    pass


class MainApp(App):
    sound = ObjectProperty(None, allownone=True)

    def build(self):
        return ScreenManagement()

    def on_state(self, state, filename):
        print("ONSTATE!!!")
        print("\tstate=", state)

        if self.sound is None:
            self.sound = SoundLoader.load(filename)

        # stop the sound if it's currently playing
        if self.sound.status != 'stop':
            self.sound.stop()

        if state == "down":
            self.sound.volume = .5
            self.sound.play()
        else:   # if state == "normal":
            if self.sound:
                self.sound.stop()
                # self.sound.unload()
                self.sound = None


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

main.kv

#:kivy 1.11.0

<ScreenManagement>:
    MusicScreen:
        name: 'music'

<MusicScreen>:
    text_input: text_input
    id: "music"
    name: "music"

    BoxLayout:
        size: root.size
        pos: root.pos
        orientation: "vertical"
        FileChooserListView:
            id: filechooser
            rootpath: "/home/iam/Music/"
            on_selection: text_input.text = self.selection and self.selection[0] or ''

        TextInput:
            id: text_input
            size_hint_y: None
            height: 50
            multiline: False

        ToggleButton:
            size_hint: 1, .2
            text: "Play/Stop By File"
            on_state: app.on_state(self.state, text_input.text)

        ToggleButton:
            id: musicbutton
            size_hint: 1, .2
            text: "Play/Stop By Title"
            on_state: app.on_state(self.state, text_input.text)

关于python - kivy随机屏幕显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54839617/

相关文章:

python - 如何使用 matplotlib 在 Python 中的堆积条形图中填充或着色两个对应点之间的区域?

python - Cloud Functions 中发生未知错误

python Selenium : stale element reference: element is not attached to the page document

java - App Engine 创建音频文件并通过电子邮件发送

java - Ogg格式的录音?

android - 在 Android 上以静音模式播放声音时遇到问题

python - 理解 keras 日志输出时出现问题

python - 从python中的类变量调用类/静态方法

python - 如何使用matplotlib根据条形高度绘制具有特定颜色的3D条形图

python - 如何在请求 HTTPS 调用中抑制有关缺少证书验证的警告?