Kivy 外部规则继承 2
Posted
技术标签:
【中文标题】Kivy 外部规则继承 2【英文标题】:Kivy outside rule inherence 2 【发布时间】:2015-10-16 01:15:45 【问题描述】:作为后续问题:
Kivy outside rule inherence Kivy rule inherence with add_widget()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 中访问的全局?
(如果我将 global 放在 font_Kanji 前面并在 .kv 文件中删除 'self.imp' 我会收到错误消息:“NameError: name 'font_kanji' is not defined”)
【问题讨论】:
【参考方案1】:您的猜测是正确的:当您的按钮被创建时,它的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
的变化。
如果您想绑定两个属性,那么您必须从Instance.font_kanji
端调用bind
函数(因为我们想对其更改做出反应)以动态创建FancyButton
实例:
class Important(StackLayout):
font_kanji = os.path.join('fonts', 'TakaoPMincho.ttf')
def NoInspiration(self, smile):
print("Received: ".format(smile))
def AddFancy(self):
temp = FancyButton(text='f', imp = self)
self.bind(font_kanji=temp.setter('font_name'))
self.ids.boxy.add_widget(temp)
kv语言定义的接口可以直接绑定:
<Important>:
id: imp
BoxLayout:
id: boxy
orientation: 'vertical'
FancyButton:
text: "smiley"
font_name: root.font_kanji
imp: root
Button:
text: "add fancy"
on_release: imp.AddFancy()
''')
【讨论】:
这适用于我不必在运行后更改的字体:)。但是,将来参考是否应该知道 font_name 是否应该根据 imp.font_kanji 更改仍然很有趣。 bind() 能以某种方式实现吗?以上是关于Kivy 外部规则继承 2的主要内容,如果未能解决你的问题,请参考以下文章