作为后续问题:
- Kivy 外部规则固有 https://stackoverflow.com/questions/31618565/kivy-outside-rule-inherence
- Kivy 规则继承与 add_widget() https://stackoverflow.com/questions/31621302/kivy-rule-inherence-with-add-widget/31625031#31625031
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'))
,但无济于事。
Question
如何让 font_name 引用 font_kanji?我应该使用全局吗?如果是,如何在 Python 中设置一个可以在 .kv 中访问的全局变量?
(如果我将 global 放在 font_Kanji 前面并删除 .kv 文件中的“self.imp”,则会收到错误:“NameError:名称“font_kanji”未定义”)