Kivy外面的规则固有2

时间:2015-07-25 11:58:54

标签: python kivy

作为后续问题:

main.py

import os
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.stacklayout import StackLayout
from kivy.properties import ObjectProperty


class FancyButton(Button):
    imp = ObjectProperty(None)


class Important(StackLayout):

    font_kanji = os.path.join('fonts', 'TakaoPMincho.ttf')

    def NoInspiration(self, smile):
        print("Received: {}".format(smile))

    def AddFancy(self):
        print(self.ids)
        temp = FancyButton(text='f', imp = self)
        self.ids.boxy.add_widget(temp)


class TestApp(App):
    def build(self):
        pass

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

test.kv

#:kivy 1.9.0

<FancyButton>:
    font_name: self.imp.font_kanji  # ERROR
    on_release: self.imp.NoInspiration(':)')  # WORKS


<Important>:
    id: imp

    BoxLayout:
        id: boxy
        orientation: 'vertical'

        FancyButton:
            text: "smiley"
            imp: root

        Button:
            text: "add fancy"
            on_release: imp.AddFancy()


BoxLayout:
    Important

在上面的示例'on_release:self.imp.NoInspiration(':)')'有效,因为FancyButton有'imp:root'。

然而'font_name:self.imp.font_kanji'不起作用并给出错误:

  

AttributeError:'NoneType'对象没有属性'font_kanji'

我的猜测是因为on_release在加载所有小部件并直接加载font_name之后发生,因此没有'imp:root'。

我也尝试过:

font_kanji = StringProperty(os.path.join('fonts', 'TakaoPMincho.ttf'))

,但无济于事。

问题

如何获取font_name参考font_kanji?我应该使用全球吗?如果是,您将如何在Python中设置可以在.kv中访问的全局?

(如果我将全局放在font_Kanji前面并删除.kv文件中的'self.imp',我会收到错误:“NameError:name'font_kanji'未定义”)

1 个答案:

答案 0 :(得分:1)

您的猜测是正确的:创建按钮时,其paxdiablo属性为Third normal form (3NF) - 2NF and every non-key column in a table depends on nothing but the key.。解决这个问题的方法是观察imp属性并在其处理程序中设置None的值:

imp

这样,在使用正确的font_name实例初始化class FancyButton(Button): imp = ObjectProperty(None) def on_imp(self, obj, imp): if imp: self.font_name = imp.font_kanji 属性后设置字体。这种方法的缺点是imp的更改不会触发Important的更改。

如果您希望将这两个属性绑定,那么您必须从Instance.font_kanji方面调用FancyButton.font_name功能(因为我们想对其更改做出反应),以便动态创建bind个实例:

Instance.font_kanji

用kv语言定义的接口可以直接进行绑定:

FancyButton