
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がインスタンス化されていないからです。
[st-myblock id=”3235″]
コメント