【问题标题】:GridLayout isn't working properly in .kv fileGridLayout 在 .kv 文件中无法正常工作
【发布时间】:2021-02-17 23:54:53
【问题描述】:

我是 Kivy 的新手。我在 kivy docs 上关注了一个示例,在那里我遇到了以下代码。 b但它不能正常工作。

first.py

from kivy.app import App
from kivy.uix.gridlayout import GridLayout

class LoginScreen(GridLayout):
    pass

class MyApp(App):
    def build(self):
        return LoginScreen()

if __name__ == '__main__':
    MyApp().run()

我的.kv

#:kivy 2.0
<LoginScreen>:
    f_username: username
    f_password: password
    GridLayout:
        rows: 2
        cols: 2
        padding: 10
        spacing: 10
        Label:
            text: "Username"
        TextInput:
            id: username
            multiline: False
        Label:
            text: "Password"
        TextInput:
            id: password
            password: True
            multiline: False

如果我从 kivy 和 python 文件中删除 LoginScreen 类,此代码可以正常工作。喜欢

class MyApp(App):
    def build(self):
        return

#:kivy 2.0
    f_username: username
    f_password: password
    GridLayout:
        rows: 2
        
...

谁能帮我弄清楚发生了什么?

【问题讨论】:

    标签: python-3.x kivy-language


    【解决方案1】:
    class LoginScreen(GridLayout):
        pass
    

    这意味着当您使用 LoginScreen 类创建实例时,该实例变为 GridLayout。

    # GridLayout
    <LoginScreen>:
        f_username: username
        f_password: password
    
        # Another GridLayout!
        GridLayout:
            ...
    

    LoginScreen 已经基于 GridLayout,但您正尝试向该类添加另一个 gridlayout。在这种情况下,行和列没有定义在最外面的网格布局上。

    #:kivy 2.0
    
    <LoginScreen>:
        f_username: username
        f_password: password
    
        rows: 2
        cols: 2
        padding: 10
        spacing: 10
        Label:
            text: "Username"
        TextInput:
            id: username
            multiline: False
        Label:
            text: "Password"
        TextInput:
            id: password
            password: True
            multiline: False
    

    删除重复的布局将解决问题。

    【讨论】:

    • 非常感谢。这工作正常。你能解开我的一个疑惑吗?什么是 f_username 以及为什么要使用 f_ ?
    • 您可以将它们视为变量。由于“rows”、“cols”、“padding”和“spacing”是 Gridlayout 的属性,所以当您在属性上设置值时,它们之前的值会被更改。但是 Gridlayout 没有属性“f_username”和“f_password”。如果您设置这些值,您将创建新属性。您可以设置任何属性,例如“my_name: Adib”。所以,当前的“f_username”是带有“id:username”的TextInput小部件,“f_password”是带有“id:password”的TextInput小部件。
    • 谢谢安东尼??????
    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2020-12-30
    • 2014-01-09
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多