带有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: "PythonnSnowdennMr.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: "BananannOrangennTeannSleep"
            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: "AssemblynnRubynnC"
            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: "ProlognnPygamennC++"
            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个屏幕,如果您可以帮助我弄清楚如何按下"启动"按钮时如何停止菜单歌曲,以便我可以按Screen1上的"歌曲"按钮播放其歌曲,我将非常敬畏。感谢您的耐心配合。

触摸"下一个"按钮时显示随机屏幕

使用screen_names

screen_names

添加了所有屏幕小部件的名称的列表。列表是 仅阅读。

screens_names是一个杂乱无章的,仅读取。它已更新 如果屏幕列表更改或屏幕名称更改。

摘要

#: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}

停止/播放音乐

您可能想使用toggletton而不是按钮播放音乐。请参阅下面的示例。

示例

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)

最新更新