Python 3.x 小部件在KV文件中不断重复/复制
我有一个用KV语言设计的UI,如下所示: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)
<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()