【问题标题】:How to give access to kivy classes to take up parameters如何授予对 kivy 类的访问权限以获取参数
【发布时间】:2020-10-26 19:37:17
【问题描述】:

实际上我的疑问是我们如何为 kivy 类提供参数。例如,当我们在 python 中创建普通类时,我们创建了一个 __init__ 函数,在该函数下我们提供了一些参数 def __init__(self,x,y,z) 。我们如何将这种类型的参数提供给 kivy 类... 我有这个我在 Kivy my.kv file创建的课程@

<MyGrid>:

    input : input
    label : label

    hint_text : self.hint_text
    pos_hint : self.pos_hint

    MDCard:
        size_hint : 0.75,0.44
        pos_hint :   self.pos_hint            #  This is first parameter
        elevation: 1

        FloatLayout:

            MDTextField:
                id : input
                markup: True
                multiline : True
                size_hint : 0.8,0.7
                pos_hint:{'x':0.05,'top':0.82}
                mode : 'rectangle'
                hint_text : self.hint_text # This is the second parameter

如您所见,我曾尝试使用 self.pos_hintself.hint_text,但这不起作用。我想为每个 MyGrid 小部件提供不同的 pos 和文本 .. 所以知道如何实现或者是他们做错了什么。

#main .py file consist of just this class MyGrid

class MyGrid(FloatLayout):

    def __init__(self,**kwargs):
        super(MyGrid, self).__init__(**kwargs)

【问题讨论】:

    标签: python class kivy


    【解决方案1】:

    如果通过扩展现有的WidgetFloatLayout 类是Widget)创建类,那么超类的__init__() 将被自动调用。当您创建MyGrid 的实例时,将调用FloatLayout__init__() 方法。所以你可以像这样定义MyGrid

    class MyGrid(FloatLayout):
        pass
    

    您可以指定MyGrid 的属性,就像为FloatLayout 指定的一样。例如,在您的kv

    <MyGrid>:
        pos_hint: {'center_x':0.5, 'top':1.0}
    

    因此,一般而言,您可以像对待 FloatLayout 一样对待 MyGrid

    您可以在MyGrid 中创建自己的属性,然后可以在“kv”中引用这些属性。这是对您发布的代码的修改:

    from kivy.lang import Builder
    from kivy.properties import StringProperty, DictProperty
    from kivy.uix.floatlayout import FloatLayout
    from kivymd.app import MDApp
    
    kv = '''
    <MyGrid>:
        input: input
        
        MDCard:
            size_hint : 0.75,0.44
            pos_hint : root.card_pos_hint            #  This is first parameter
            elevation: 1
    
            FloatLayout:
    
                MDTextField:
                    id : input
                    markup: True
                    multiline : True
                    size_hint : 0.8,0.7
                    pos_hint:{'x':0.05,'top':0.82}
                    mode : 'rectangle'
                    hint_text : root.hint_text # This is the second parameter
    '''
    
    class MyGrid(FloatLayout):
        hint_text = StringProperty('')
        card_pos_hint = DictProperty()
    
    class TestApp(MDApp):
        def build(self):
            Builder.load_string(kv)
            return MyGrid(hint_text='This is a Hint', card_pos_hint={'right':1, 'top':1})
    
    TestApp().run()
    

    注意kv 中的root 指的是MyGrid。此外,kivy 会自动处理 MyGrid() 创建中提供的属性,只要它们已经在 MyGrid 类中定义。而且,由于 hint_textcard_pos_hint 是 kivy Properties,所以每当您更改 MyGrid 实例的 hint_text 属性时,MDTextField 提示将自动更新。同样,每当您修改MyGrid 实例的card_pos_hint 属性时,MDCard 的位置将自动更新。

    【讨论】:

    • Thnaks 兄弟,但我如何访问hint_text
    • 它真的很有魅力,谢谢错过了这些东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多