我有一个用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
。我也尝试过将GridLayout
与cols:2
一起使用,但是得到类似的结果。
因此,tl; dr,左列完全正确,但也重复到右半部分。我该如何更改?
答案 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。有关详细信息,请参阅示例。
有两种方法可以将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)
#: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()