Python 3.x 小部件在KV文件中不断重复/复制

Python 3.x 小部件在KV文件中不断重复/复制,python-3.x,kivy,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)

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

<MainLayout>:
BoxLayout:
    orientation:"horizontal"
    BoxLayout:
        orientation:"vertical"
        Button:
            size_hint:(1,.9)
            text:"1"
        Button:
            size_hint:(1,.1)
            text:"2"
我想要一个不对称的布局,其中主窗口有两列,左列有两个小部件(上半部分和下半部分),右列类似。 每列中的每个小部件都需要高度不对称

不管出于什么原因,上面给出的设计总是“重复”我的左右两半,没有“空白”空间。 我想要两个
BoxLayout
,每列一个。我的
也是一个
BoxLayout
。我也尝试过用
cols:2
制作一个
GridLayout
,但我得到了类似的结果

这是我的输出:

因此,tl;dr,左边的一栏是正确的,但它也会重复到右边的一栏。我怎样才能改变它?

问题-两个根部件 因为有两个根窗口小部件,所以会重复该列。一个来自
Builder.load_string(kv.read())
,另一个来自
class GuiApp()
,即分别来自Builder名称约定

解决方案 删除以下内容:

with open('gui.kv', 'r') as kv:
    Builder.load_string(kv.read())
由于
是一个BoxLayout,因此您不需要另一个BoxLayout。有关详细信息,请参考示例

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

按名称约定:

Kivy在中查找与应用程序类同名的Kv文件 小写,如果以“App”结尾,则减去“App”,例如:

MyApp -> my.kv
如果此文件定义了根小部件,则它将附加到应用程序的 根属性,并用作应用程序小部件树的基础

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

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

Builder.load_string(kv_string)
例子 试验电压(千伏) 输出

提供一个@eyllanesc,我已经添加了附带的
py
文件。谢谢非常感谢@ikolim,但我对你的解决方案感到困惑。您的输出显示了与我类似的结果,您在左侧和右侧列中重复了“1”和“2”。我想独立地修改每列中的小部件等,而不是让它们重复。您计划在哪里更新小部件,即在kv文件或Python代码中?请参考没有动态类的更新帖子。这是我从你的更新代码中得到的,我自己也尝试过。我需要在
kv
文件中定义的静态小部件,我将使用它调用
py
文件中的函数。功能不是目前的问题,UI设计是。重复的列是由于应用程序中的两个根小部件造成的。用open('gui.kv',r')作为kv:Builder.load\u字符串(kv.read())删除
有关解释,请参阅我更新的帖子。
Builder.load_string(kv_string)
#: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"
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()