Kivy言語では、次のようなものでルートウィジェットを参照することができます
<RootWidget>:
BoxLayout:
SomeButton:
on_press: print root
しかし、Pythonからrootにアクセスしようとすることは不可能です
class SomeButton(Button):
def __init__(self, **kwargs):
super(SomeButton, self).__init__(**kwargs)
self.text = "Button"
self.font_size = 15
def on_press(self, *args):
print root
結果として
NameError: global name 'root' is not defined
またはself.root
を使用している場合、
AttributeError: 'SomeButton' object has no attribute 'root'
私の回避策は、メインアプリのbuild()
メソッド内でグローバル変数を宣言することでした。これは、Appクラスにいるときにルートウィジェットにアクセスできるため、global root
やroot = self.root
のようなものです。 app
でも同じことができます。
アプリから実際のルートウィジェットが必要な場合は、任意のウィジェットクラス内から次を使用します...
from kivy.app import App
...
class myWidget(BoxLayout):
app= App.get_running_app()
app.root.whatever-you-want
Kvファイル内では、ルートは常に山かっこで囲まれた親を参照します。したがって、ファイル内のどこにいるかに応じて、kvファイルで参照できる複数のルートが存在する可能性があります。
_# Root here refers to the parent class in angle brackets
<SomeClass>:
BoxLayout:
Label:
text: root.label_text
# and further down in the same kv file, this other
# class is also a root.. here root refers to
# this class
<SomeOtherClass/Widget/LayoutEtc>:
BoxLayout:
Label:
text: root.label_text
_
pythonファイルでは、これらのクラスは次のように表すことができます。
_class SomeClass:
label_text = StringProperty("I'm a label")
def __init__(**kwargs):
super(SomeClass, self).__init__(**kwargs)
b = BoxLayout()
l = Label(text=self.label_text)
b.add_widget(l)
self.add_widget(b)
# now we're set up like the first class in the above kv file
_
上を見て、kvファイルがテキストをラベルに割り当てた方法と、上記のpythonファイル)でどのように行われたかを比較します。kvでは_root.label_text
_でしたが、上記ではクラスself
を使用します。_text=self.label_text
_のように。ボックスレイアウトを追加するときにも使用されます。self.add_widget(b)
。self
は、の現在のインスタンスを参照する方法です。クラス。
これが、基本的にkvファイルでは「root」となるものを参照する方法ですが、pythonファイルでは。
self
が使用される理由がわからない場合は、Pythonのクラスについて学ぶことをお勧めします。これは、その説明がそこにあるためです。
ただそこにそれを出すために。
親
Button:
on_press: root.something()
親の親:
Button:
on_press: root.parent.something()