我是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...
结构:
File: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"
File: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')
1.我试着用Builder.load_file
,添加UserIDtxt: UserIDtxt
到KV文件显示为错误,你能让我了解我的错误在哪里.此外,根据kivy规范,它应该自动加载KV文件,如果文件名是相同的小写字母,为什么我要再次使用一个构建器类.
1.另外,当我在KV文件中注解掉UserIDtxt: UserIDtxt
时,我收到以下日志。
[WARNING ] <ui.LoginForm.LoginForm object at 0x02DA9458>
have no cols or rows set,layout is not triggered. [INFO ] [Base ] Leaving application in progress...
谢谢大家。
[编辑]:@inclement说的都管用,谢谢。我做了如下修改:
1.我添加了my.kv文件,内容与loginform.kv相同,没有变化。
1.删除了loginForm.py
中的构建声明:然后我收到以下信息:应用程序没有显示再次,你能告诉我如何添加多个类在KV文件,并让他们在各自的py文件中使用.
[INFO] [Base ] Start application main loop [WARNING ] <ui.LoginForm.LoginForm object at 0x02DB1420>
have no cols or rows set,layout is not triggered.
1条答案
按热度按时间mitkmikd1#
1)你的load_file在错误的地方(你实际上还没有看到这个错误,因为你的其他问题)
你的小部件的任何kv文件定义都是在小部件的普通
__init__
方法中应用的,你在这里用super调用。因为你只在 * 之后 * 才尝试加载kv文件,kivy不知道你的规则,所以(根据警告消息)布局不会被触发。你可以把
load_file
放在super
上面,但更简单的方法是在应用开始时加载所有的kv文件(例如,在build
期间的第一件事),或者把它们放在默认的kv文件中,如下所述。性能影响将是最小的,如果它很重要,你可以稍后更改它。编辑:也许你误解了load的作用-它只从kv文件中加载widget定义,它不会将它们应用到任何widget。这只会在widget示例化时发生,这就是为什么你需要首先加载文件。
2)
UserIDtxt
属性不应为大写Kivy语言使用首字母大小写来判断一行是引用属性还是子widget。在这种情况下,它认为它是一个子widget(因为widget类名应该以大写字母开头),所以你的语法是错误的。
3)您的自动加载问题:
此外,按照kivi规范,它应该自动加载kv文件,如果文件名是相同的小写字母
Kivy会自动尝试加载一个 single kv文件,文件名基于App类的小写形式(如果存在,则不带App后缀),在本例中,您的App类是
MyApp
,因此Kivy会尝试加载不存在的my.kv
。