【问题标题】:Kivy FloatLayout in multiple screens多个屏幕中的 Kivy FloatLayout
【发布时间】:2019-10-06 19:02:16
【问题描述】:

kivy 中的 FLoatLayout 似乎每次仅限于一个屏幕。我想使用多个屏幕并在所有屏幕上应用 FloatLayout。

我的尝试:

  1. 我知道我可以将所有屏幕分成不同的 kivy 和 python 然后将文件组合起来,但我不想这样做,因为它易于使用。
  2. 我尝试让我的类(屏幕)从两个屏幕继承 和 FloatLayout,但显然 ScreenManager 不接受 '非屏幕输入'
  3. 我使用的是 kivy 语言,(不是 python)所以我不能只分配 窗口类中的 FloatLayout 小部件然后返回它。

ps。我想使用 FloatLayout 的原因是避免重叠的小部件。如果它产生类似的结果,我不介意使用另一种布局。

【问题讨论】:

  • 使用 FloatLayout 可以获得重叠小部件的选项...(也可以使用 RelativeLayout)。 BoxLayout 和 GridLayout 是一些防止重叠的布局。不只是在屏幕上使用screen1.add_widget(MyFloatLayoutWidget) 有什么原因吗?
  • 非常感谢!我有点困惑。我不想使用 screen1.add_widget 的原因是我担心这样做会影响 kivy 语言代码。我会尝试 BoxLayout,然后发送我的结果!
  • 也可以放在kv部分。我会写一个答案给你看代码...

标签: python kivy


【解决方案1】:

您可以像这样在屏幕中添加另一个布局(在代码的 kv 部分中):

    ScreenManager:
        id: screens
        Screen:
            name: "main"
            id: main
            BoxLayout:
                id: main_box

您可以在代码的 python 部分执行类似的操作:

main_box = BoxLayout()
self.ids.main.add_widget(main_box)

【讨论】:

    【解决方案2】:

    对于多屏,需要在kv文件中声明为screenmanager,此时screenmanager名称为CustomScreen,需要分屏和Float Layout:

    <CustomScreen>:
        screen1:
        screen2:
        screen3:
    
    <screen1>:
        BoxLayout:
            Button:
                text:'open FloatLayout'
                on_press:root.openFloatExample()
            Button:
                text: 'close FloatLayout'
                on_press:root.closeFloatExample()
    
    <screen2>:
        BoxLayout:
    
    <floatExample>:
        FloatLayout:
           BoxLayout:
    

    在您的 Python 代码中,您声明 CustomScreen,并将屏幕添加为小部件,然后您需要创建一个对象,该对象将在屏幕初始化时接收 FloatLayout,然后您可以使用此对象,添加或删除它从屏幕上:

    class CustomScreen(ScreenManager):
        def __init__(self):
            super(CustomScreen, self).__init__()
            self.add_widget(tela1())
            self.add_widget(tela2())
    
    class tela1(Screen):
        def __init__(self):
            super(tela1, self).__init__()
    
            global objetoFloatLayout
            objetoFloatLayout = floatExample()
        
        def openFloatExample(self):
            self.add_widget(objetoFloatLayout)
        
        def closeFloatExample(self):
            self.remove_widget(objetoFloatLayout)
    
    class tela2(Screen):
        def __init__(self):
            super(tela2, self).__init__()
    
    
    class floatExample(FloatLayout):
        def __init__(self):
            super(floatExample,self).__init__()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2019-02-26
      • 1970-01-01
      • 2021-05-09
      相关资源
      最近更新 更多