【问题标题】:random screen display with kivy带有kivy的随机屏幕显示
【发布时间】:2019-02-23 08:21:04
【问题描述】:

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

#: 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()

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

【问题讨论】:

  • 非常混乱的帖子。您的帖子首先询问如何display a random screen。然后在最后,您询问how can i STOP THE MENU SONG when i hit the "START" BUTTON。你的问题是什么(请一次只问一个)。
  • 对不起,我不是故意的,所以主要问题是我尝试制作游戏的屏幕,每次我点击“NEXT”它都会显示一个带有标签的随机屏幕,但我只是设法让游戏遵循一种模式,当我点击“NEXT”时,每次 screen1 screen2 screen3 都会以相同的方式运行,现在我希望它在我点击“NEXT”按钮时进入随机屏幕。

标签: python python-3.x audio kivy


【解决方案1】:

触摸“NEXT”按钮时显示随机画面

使用screen_names

屏幕名称

添加的所有Screen 小部件的名称列表。名单是 只读。

screens_names 是 AliasProperty 并且是只读的。它已更新 如果屏幕列表更改或屏幕名称更改。

片段

#: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 而不是 Button 来播放音乐。请参考以下示例。

示例

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)

【讨论】:

  • 对于随机屏幕,我想你也可以使用root.manager.current = random.choice(root.manager.screen_names)
  • 很有趣,让我试一试并发布结果。谢谢。
  • 是的,它成功了,我使用上面的 sn-p 来指导我完成整个过程及其工作,现在我要完成这个游戏。非常感谢大家。当我完成它时,请确保将它发送给你们所有人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
相关资源
最近更新 更多