小部件在KV文件中不断重复/复制

时间:2018-07-02 23:54:00

标签: python-3.x kivy

我有一个用KV语言设计的UI,如下所示:

<MainLayout>:
BoxLayout:
    orientation:"horizontal"
    BoxLayout:
        orientation:"vertical"
        Button:
            size_hint:(1,.9)
            text:"1"
        Button:
            size_hint:(1,.1)
            text:"2"

这是随附的py文件:

from kivy import Config
from kivy.app import App, Builder
from kivy.uix.boxlayout import BoxLayout

with open('gui.kv', 'r') as kv:
    Builder.load_string(kv.read())


class MainLayout(BoxLayout):
    def __init__(self, **kwargs):
        super(MainLayout, self).__init__(**kwargs)

class GuiApp(App):
    Config.set('graphics', 'resizable', '0')
    Config.set('graphics', 'width', '1600')
    Config.set('graphics', 'height', '1000')

    def build(self):
        self.title = "TestGUI"
        return MainLayout()

if __name__ == '__main__':
    GuiApp().run()

我想要一个不对称的布局,其中主窗口有两列,左列有两个小部件(上半部分和下半部分),右列类似。 每列中的每个小部件的高度都必须不对称。

无论出于何种原因,上面给定的设计都会“重复”我的左右两半,没有“空白”空间。 我想要两个BoxLayout,每列一个。我的<MainLayout>也是BoxLayout。我也尝试过将GridLayoutcols:2一起使用,但是得到类似的结果。

这是我的输出: Current output

因此,tl; dr,左列完全正确,但也重复到右半部分。我该如何更改?

1 个答案:

答案 0 :(得分:0)

问题-两个根小部件

由于存在两个根窗口小部件,因此您正在重复该列。一个来自Builder.load_string(kv.read()),另一个来自class GuiApp(),即分别来自 Builder 名称约定

解决方案

删除以下内容:

with open('gui.kv', 'r') as kv:
    Builder.load_string(kv.read())

由于<MainLayout>是BoxLayout,因此不需要其他BoxLayout。有关详细信息,请参阅示例。

注意

manual provisioning docs

  

有两种方法可以将Kv代码加载到您的应用程序中:

     

按名称惯例:

     

Kivy在以下位置查找与您的App类同名的Kv文件   小写字母,如果以“ App”结尾则减去“ App”,例如:

MyApp -> my.kv
     

如果此文件定义了Root Widget,它将被附加到应用程序的   根属性,并用作应用程序小部件树的基础。

     

通过Builder ,您可以告诉Kivy直接加载字符串或文件。如果此字符串或文件定义了根窗口小部件,它将由   方法:

Builder.load_file('path/to/file.kv')
     

或:

Builder.load_string(kv_string)

示例

test.kv

#:kivy 1.10.0

<MainLayout>:
    orientation:"horizontal"

    BoxLayout:
        orientation:"vertical"
        Button:
            size_hint:(1,.9)
            text:"1"
        Button:
            size_hint:(1,.1)
            text:"2"

    BoxLayout:
        orientation:"vertical"
        Button:
            size_hint:(1,.9)
            text:"3"
        Button:
            size_hint:(1,.1)
            text:"4"

main.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout


class MainLayout(BoxLayout):
    pass


class TestApp(App):

    def build(self):
        return MainLayout()


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

输出

How to load KV