Kivy Python错误 - KV文件未触发布局

0 投票
1 回答
1275 浏览
提问于 2025-04-18 10:42

我刚接触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')
        
  1. 我尝试使用了Builder.load_file,但是在KV文件中添加UserIDtxt: UserIDtxt时出现了错误。能不能告诉我错误出在哪里?另外,根据Kivy的规定,如果文件名相同且都是小写字母,它应该自动加载KV文件,为什么我还需要再使用一个构建类呢?

  2. 还有,当我在KV文件中注释掉UserIDtxt: UserIDtxt时,收到了以下日志信息。

    [警告] <ui.LoginForm.LoginForm object at 0x02DA9458> 没有设置列或行,布局没有被触发。 [信息] [Base] 应用程序正在进行中...

谢谢。

[编辑]: @inclement 提到的所有建议都有效,谢谢你。我做了如下修改:

  1. 我添加了一个名为my.kv的文件,内容和loginform.kv完全一样,没有任何更改。

  2. loginForm.py中移除了构建语句: 然后我又遇到了一个问题:应用程序没有显示出来,能不能告诉我如何在KV文件中添加多个类,并在相应的py文件中使用它们?

    [信息] [Base] 开始应用程序主循环 [警告] <ui.LoginForm.LoginForm object at 0x02DB1420> 没有设置列或行,布局没有被触发。

1 个回答

2

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,但这个文件并不存在。

撰写回答