web-dev-qa-db-ja.com

PythonからKivyのルートウィジェットを参照するにはどうすればよいですか?

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'
14
Tan Wang

私の回避策は、メインアプリのbuild()メソッド内でグローバル変数を宣言することでした。これは、Appクラスにいるときにルートウィジェットにアクセスできるため、global rootroot = self.rootのようなものです。 appでも同じことができます。

4
Tan Wang

アプリから実際のルートウィジェットが必要な場合は、任意のウィジェットクラス内から次を使用します...

from kivy.app import App
...
class myWidget(BoxLayout):
    app= App.get_running_app()
    app.root.whatever-you-want
19
Jim Morris

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のクラスについて学ぶことをお勧めします。これは、その説明がそこにあるためです。

5
Totem

ただそこにそれを出すために。

Button:
  on_press: root.something()

親の親:

Button:
  on_press: root.parent.something()
0
wedran