Kivy Python错误 - KV文件未触发布局
我刚接触Python和Kivy,在尝试的时候遇到了一个错误。我在网上查了很多资料,但还是没找到问题所在。能不能帮我解释一下我下面代码中的错误:
错误信息:
[INFO ] [Base ] Start application main loop
[WARNING ] `<ui.LoginForm.LoginForm object at 0x02D503E8>` have no cols or rows set, layout is not triggered.
[INFO ] [Base ] Leaving application in progress...
结构:
文件:Main.py
from kivy.app import App
from ui.LoginForm import LoginForm
class MyApp(App):
def build(self):
c = LoginForm()
return c
if __name__ in ( '__main__','__android'):
MyApp().run()
File: loginform.kv
<LoginForm>
UserIDtxt: UserIDtxt
rows: 2
cols:2
Label:
text: 'User ID:'
size_hint_y: None
height: '40dp'
TextInput:
id: UserIDtxt
size_hint_y: None
height: "40dp"
Label:
text: "User PW:"
size_hint_y: None
height: "40dp"
TextInput:
id: "UserPWtxt"
password: True
size_hint_y: None
height: "40dp"
文件:LoginForm.py
from kivy.uix.gridlayout import GridLayout
from kivy.lang import Builder
class LoginForm(GridLayout):
'''
classdocs
'''
def __init__(self, **kwargs):
'''
Constructor
'''
super(LoginForm, self).__init__(**kwargs)
Builder.load_file('ui/loginform.kv')
我尝试使用了
Builder.load_file
,但是在KV文件中添加UserIDtxt: UserIDtxt
时出现了错误。能不能告诉我错误出在哪里?另外,根据Kivy的规定,如果文件名相同且都是小写字母,它应该自动加载KV文件,为什么我还需要再使用一个构建类呢?还有,当我在KV文件中注释掉
UserIDtxt: UserIDtxt
时,收到了以下日志信息。[警告]
<ui.LoginForm.LoginForm object at 0x02DA9458>
没有设置列或行,布局没有被触发。 [信息] [Base] 应用程序正在进行中...
谢谢。
[编辑]: @inclement 提到的所有建议都有效,谢谢你。我做了如下修改:
我添加了一个名为my.kv的文件,内容和loginform.kv完全一样,没有任何更改。
从
loginForm.py
中移除了构建语句: 然后我又遇到了一个问题:应用程序没有显示出来,能不能告诉我如何在KV文件中添加多个类,并在相应的py文件中使用它们?[信息] [Base] 开始应用程序主循环 [警告]
<ui.LoginForm.LoginForm object at 0x02DB1420>
没有设置列或行,布局没有被触发。
1 个回答
1) 你的load_file放错地方了(你现在还看不到这个错误,因为你有其他问题)
super(LoginForm, self).__init__(**kwargs)
Builder.load_file('ui/loginform.kv')
任何关于你小部件的kv文件定义都是在小部件正常的 __init__
方法中应用的,而你在这里通过super调用了这个方法。因为你是在这个过程完成后才尝试加载kv文件,所以kivy不知道你的规则,因此(根据警告信息)布局没有被触发。
你可以把 load_file
放在 super
之前,但更简单的方法是直接在你的应用程序开始时加载所有的kv文件(例如,在 build
方法的第一步),或者把它们放在默认的kv文件中,下面会解释。性能影响很小,如果重要的话,你可以以后再修改。
补充:也许你误解了load的作用——它只是加载kv文件中的小部件定义,并不会把它们应用到任何小部件上。只有在小部件被实例化时,才会发生这种应用,这就是为什么你需要先加载文件。
2) 你的 UserIDtxt
属性不应该是大写的
Kivy语言通过首字母的大小写来判断一行是指属性还是子小部件。在这种情况下,它认为这是一个子小部件(因为小部件类名应该以大写字母开头),所以你的语法是错误的。
3) 关于你的自动加载问题:
根据kivy的规定,如果文件名是小写的,它应该自动加载kv文件
Kivy会自动尝试加载一个基于你App类的小写形式命名的 单个 kv文件(如果存在App后缀则不包括)。在这个例子中,你的应用类是 MyApp
,所以kivy会尝试加载 my.kv
,但这个文件并不存在。