KV lang中自定义小部件的自定义属性 - kivy

时间:2015-02-01 21:04:58

标签: python-3.x kivy

我正在尝试制作一个自定义小部件,它有一个属性名称" MaxHeight",属性工作正常,但不在KV文件中。

我的自定义小工具KV代码是:

<ComboBox>
    displaybox:displaybox
    DropDown:
        id: displaybox
        height: root.height

和Python代码是:

class ComboBox(Button):
    displaybox = ObjectProperty(None)
    #displaybox = DropDown

    Items = dict()
    MaxHeight = NumericProperty(None)

    def __init__(self, **kwargs):
        super(ComboBox,self).__init__(**kwargs)
        self.bind(MaxHeight=self.setter("MaxHeight"))
        #self.displaybox.height=self.MaxHeight
        #self.bind(self.displaybox.height=self.setter("MaxHeight"))

    def AddItem(self,Title,Value):
        if Value not in self.Items:
            self.Items[Value] = Title
            tmp = ComboBoxItem(text=Title,Tag=Value,
                               size_hint_y=None,height=32)
            tmp.bind(on_release=lambda tmp: self.UpdateSelected(tmp.text, tmp.Tag))
            self.displaybox.add_widget(tmp)

    def UpdateSelected(self,Text, Value):
        self.displaybox.select(Text)
        self.text=Text

    def on_release(self, *args, **kwargs):
        self.displaybox.open(self)

    def Dismiss(self):
        self.displaybox.dismiss(self)

Code of how it is used:
    Label:
        text: 'Branch'
        font_size: FS_B
        text_size: self.size
    ComboBox:
        id: clientsdropdown
        MaxHeight: 20
    Button:

应用启动时,错误显示为:

kivy.lang.ParserException: Parser: File "E:\OS Support\workspace\TestApp\startapp.kv", line 57:
 ...
      55:    ComboBox:
      56:       id: clientsdropdown
 >>   57:       MaxHeight: 20
      58:           
      59:   Button:
  1. 请您就如何用KV语言定义自定义属性提供建议/纠正。
  2. 我正在尝试访问此maxheight并将其设置为ComboBox中的DropDown控件,是否有一种方法可以访问父窗口小部件(组合框)高度到DropDown控件。
  3. 编辑: 在上面的代码中,我重命名了所有&#34; MaxHeight&#34; to&#34; listheight&#34;,代码现在正常工作,但是,当我添加以下代码时,下拉高度没有得到更新,请你纠正我出错的地方。 代码:

    def on_listheight(self,instance,value):
        self.displaybox.height=value
    

    我按照建议使用root.parent.height达到了高度,但是想要理解为什么它没有使用上面的属性更改代码进行更新,并且下面的代码在Combobox Init部分中引发错误,说&#34; AttributeError:&#39; NoneType&#39;对象没有属性&#39;解雇&#34;&#34;,如何在应用程序启动时实现组合框解除,目前它在应用程序启动时显示为打开状态。谢谢。

    self.displaybox.dismiss()
    

1 个答案:

答案 0 :(得分:1)

在kv语言中使用的属性应该以小写字母开头,因为kv使用它来告诉它们除了小部件。

  

有没有办法访问父窗口小部件(组合框)高度到DropDown控件。

我不完全理解这个问题,但一般情况下,您可以使用self.parent访问父级。