Python

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

投稿日:2021年4月19日 更新日:

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
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

【Python】loggingの正しい使い方

開発効率やメンテナンス性の観点から、ログを残すことは非常に重要です。 Pythonにはログ出力用に「logging」モジュールが用意されています。loggingを使うことで、簡単にログ管理をすることが …

【Kivy入門】Button押下で動作するアプリの作り方【Python】

Kivyを使った簡単なGUIアプリケーションを作成します。無理のない情報量で、適宜解説をしていますので、Kivyでアプリを作ってみようかな!と考えている方は、参考にしていただけると嬉しいです。(Kiv …

【Python】グローバル変数が更新されない時の対処法

Pythonでグローバル変数を取り扱っているとき、関数内でグローバル変数の値を更新しても、更新が反映されていないということはないでしょうか。 これには、Pythonのお作法が関わっています。この解決法 …

【Python】マルチスレッドの使い方【Thread】

Pythonには、マルチスレッドと呼ばれるテクニックがあります。一般的にプログラム言語は上から下に順番に1行ずつ実行されるものです。Pythonでは、それをスレッドとして複数同時に取り扱うことが可能で …

【Kivy】AttributeError: ‘ROOT’ object has no attribute ‘_disabled_count’の対処法【Python】

Kivyでのアプリ開発をしていると、このようなエラーに出くわすことがあります。こちらのエラー対処法を紹介します。 目次1 結論:Widgetを定義したクラスのコンストラクタを修正2 補足2.1 発生条 …

yassanさんのプロフィール写真

yassan
R&Dエンジニア。
新卒で大手の社内SEになったもののスキルアップのためにITベンダーに転職。
技術調査からプログラミングまで幅広くやってます。
趣味はバイクとガジェットと遊戯王カードです。