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

xxb16uws  于 2023-04-10  发布在  Python
关注(0)|答案(1)|浏览(105)

我是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.

mitkmikd

mitkmikd1#

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文件中加载widget定义,它不会将它们应用到任何widget。这只会在widget示例化时发生,这就是为什么你需要首先加载文件。
2)UserIDtxt属性不应为大写
Kivy语言使用首字母大小写来判断一行是引用属性还是子widget。在这种情况下,它认为它是一个子widget(因为widget类名应该以大写字母开头),所以你的语法是错误的。
3)您的自动加载问题:
此外,按照kivi规范,它应该自动加载kv文件,如果文件名是相同的小写字母
Kivy会自动尝试加载一个 single kv文件,文件名基于App类的小写形式(如果存在,则不带App后缀),在本例中,您的App类是MyApp,因此Kivy会尝试加载不存在的my.kv

相关问题