Python プログラミング

【Kivy】Widgetの初期値をidで指定する方法【Python】

Kivyを使ったアプリ開発をやっていると、widgetの初期値について、kvファイルで指定するのではなくpythonファイルで設定したくなることがあると思います。
そんな時、root widgetクラスのコンストラクタにてidで設定すればできると思いきや、これはできません。

そこで、id指定でpythonファイルで初期値を設定する方法を紹介します。

結論:別関数を用意してClockで呼び出す

結論としては、ids指定で値を更新する関数を用意しておき、
root widgetクラスのコンストラクタで、Clockを使用して呼び出すのが解です。

具体的には、以下のようにします。

# 他importは省略
from kivy.clock import Clock

class MainScreen(Widget):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_once(self.update)
        
    def update(self, dt):
        self.ids.view_label.text = 'first'

# main関数やApp関数は省略

udpate関数を定義してあげて、そこでid指定でtextの値を更新します。
そして、その関数をコンストラクタにてClockで呼び出します。

これで、idがview_labelのtextに初期値で'first'が設定できました。

補足

AttributeError 'super' object has no attribute '__getattr__'

ちなみに、コンストラクタにて直でid参照するとエラーになります。

気になったので、12行直上とupdate()でself.idsを標準出力をしてみました。
結果は、以下の通りでした

__init__()->  {}
update()->  {'A': <WeakProxy to <kivy.uix.boxlayout.BoxLayout object at 0x7fc0395b5400>>, 'view_label': <WeakProxy to <kivy.uix.label.Label object at 0x7fc0395e7c40>>}

コンストラクタ側のidsには属性が何もありません。
というのも、コンストラクタ内のselfとは、superクラスが該当するからです。
つまりこの場合では、継承元であるWidgetクラスのことです。

したがって、コンストラクタ側のidsが空なのは、参照しているのがsuperクラスであり、superクラスにはidがインスタンス化されていないからです。

-Python, プログラミング
-,