【问题标题】:Multiple .kv files manipulating 2 .kv files多个 .kv 文件处理 2 个 .kv 文件
【发布时间】:2019-03-03 15:11:43
【问题描述】:

大家好,对于我上一个问题的人来说,对不起,由于这个问题让我在决赛中遇到了问题,所以我没有完成我的游戏,所以我有一个带有 2 个“START”按钮“START1”和“START2”的菜单“所以我想要的是,每当我按“START1”时,它会将我带到指定的 .kv 文件,当我按“START2”时,它会转到指定的 .kv 文件,这是我想要的图片和我所做的示例到目前为止

#: import FadeTransition kivy.uix.screenmanager.FadeTransition


ScreenManagement:

    transition: FadeTransition()
    MainScreen:
    GameScreen1:
    GameScreen2:


  Button:

    size_hint: 0.2,0.1
    font_size: 20


  MainScreen:

    name: "Start"

    Button:

        on_release: app.root.current = "game1"
        text: "START"
        color: 1,0,0,1

GameScreen1:

    name: "game1"

    Button:

        pos_hint: {"right":1,"top":0.5}
        color: 1,0,0,1 
        on_release: app.root.current = "game2"
        text: "Next"
        background: 0,1,0,1

    Label: 

        pos_hint: {"x": 0, "y": 0}
        text: "Python\n\n Ruby"
        font_size:40

    Button:

        text: "HOME"
        on_release: app.root.current = "Start"
        pos_hint: {"x": 0.1, "y": 0}


GameScreen2:

    name: "game2"

    Button:

        pos_hint: {"right":1,"top":0.5}
        color: 1,0,0,1 
        on_release: app.root.current = "game1"
        text: "Next"
        background: 0,1,0,1

    Label: 

        pos_hint: {"x": 0, "y": 0}
        text: "Assembly\n\n Prolog"
        font_size:40

    Button:

        text: "HOME"
        on_release: app.root.current = "Start"
        pos_hint: {"x": 0.1, "y": 0}

这就是程序员.kv

#: import FadeTransition kivy.uix.screenmanager.FadeTransition


ScreenManagement:
    transition: FadeTransition()
    MainScreen:
    GameScreen1:
    GameScreen2:


Button:

    size_hint: 0.2,0.1
    font_size: 20


MainScreen:

    name: "Start"

    Button:

        on_release: app.root.current = "game1"
        text: "START"
        color: 1,0,0,1

GameScreen1:

    name: "game1"

    Button:

        pos_hint: {"right":1,"top":0.5}
        color: 1,0,0,1 
        on_release: app.root.current = "game2"
        text: "Next"
        background: 0,1,0,1

    Label: 

        pos_hint: {"x": 0, "y": 0}
        text: "HELLO"
        font_size:40

    Button:

        text: "HOME"
        on_release: app.root.current = "Start"
        pos_hint: {"x": 0.1, "y": 0}


GameScreen2:

    name: "game2"

    Button:

        pos_hint: {"right":1,"top":0.5}
        color: 1,0,0,1 
        on_release: app.root.current = "game1"
        text: "Next"
        background: 0,1,0,1

    Label: 

        pos_hint: {"x": 0, "y": 0}
        text: "WORLD"
        font_size:40

    Button:

        text: "HOME"
        on_release: app.root.current = "Start"
        pos_hint: {"x": 0.1, "y": 0}

这就是social.kv

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.label import Label



class MainScreen(Screen):

    pass

class GameScreen1(Screen):

    pass

class GameScreen2(Screen):

    pass


class ScreenManagement(ScreenManager):

    pass

presentation = Builder.load_file("social.kv")
presentation = Buider.load_file("programmer.kv")

class Myapp(App):

    def builder(self):

        return presentation

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

我尝试制作 2 个构建器,但由于两者都有一个“菜单”屏幕覆盖了另一个,我想我可以这样说。所以我只想有 1 个菜单,上面有 2 个 START 按钮,就像上图一样,它可以让你开始激活指定的 .kv 文件,谁能帮忙,现在我不知道如何做到这一点,我还在研究。

【问题讨论】:

  • 我编辑了您的帖子以更好地显示您的kv 文件,但存在几个问题。首先,任何kv 文件都应该只有一个root 小部件(请参阅documentation)。其次,您的py 文件中有两行以presentation = 开头。这意味着第一个presentation 被第二个覆盖。请查看您的 kv 文件,以确保准确代表您的实际文件。一种更合理的方法可能是只使用一个 kv 文件,其中一个 Screen 用于程序员视图,另一个用于社交视图。
  • 感谢编辑文件现在看起来更好了。我希望这个应用程序有一个 kv 文件,其中有一个屏幕供程序员使用,另一个屏幕供社交使用,但问题是如何使两个 kv 文件像并行工作一样,因为上面的两个 kv 文件都有 MAINSCREEN 一个覆盖另一个但我想要像上面的图片一样工作,甚至尝试创建一个只有主屏幕的 kv 文件,但我不知道如何将 START 按钮链接到它自己的 kv 文件我不知道这是否可能
  • 您的两个kv 文件在加载时都将失败,并出现Only one root object is allowed 错误。请参阅kv 语言documentation。您对如何使用多个 kv 文件的描述听起来与使用多个 Screen 小部件完全相同,并且可以使用一个 kv 文件来完成。没有将应用程序从一个“kv”文件切换到另一个文件的记录方法。

标签: python python-3.x kivy screen


【解决方案1】:

下面是一个示例,说明如何按照您的要求进行操作。使用 2 个kv 文件。这就是 ScreenManager 会为你做的事情。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout

presentation1 = Builder.load_string('''
Button:
    text: 'This is presentation1'
    on_press: app.switchToRoot2()
''')

presentation2 = Builder.load_string('''
Button:
    text: 'This is presentation2'
    on_press: app.switchToRoot1()
''')

class MultiplKVApp(App):
    def build(self):
        self.root_layout = FloatLayout()
        self.root_layout.add_widget(presentation1)
        return self.root_layout

    def switchToRoot2(self, *args):
        self.root_layout.clear_widgets()
        self.root_layout.add_widget(presentation2)

    def switchToRoot1(self, *args):
        self.root_layout.clear_widgets()
        self.root_layout.add_widget(presentation1)

MultiplKVApp().run()

请注意,您的两个kv 文件都有MainScreenGameScreen1GameScreen2 的实例。所以 kivy 将为每个小部件创建两个独立的实例。

【讨论】:

  • 好的,让我看看我有没有这个。 ?MultiplKVApp 的工作方式类似于我上面图片的主菜单屏幕,我可以使用它在“社交”和“程序员”端之间切换。因此,使用您的想法和代码,我可以将 BUILDER.LOAD.STRING 替换为 BUILDER.LOAD_FILE,只要我在创建的两个 .kv 文件中都打开了 APP.SWITCHTOROOT,它就会得到相同的结果吗?
猜你喜欢
  • 2021-02-16
  • 1970-01-01
  • 2020-12-12
  • 2020-12-06
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多