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学習におすすめの教材

Pythonについて、しっかりと基礎から学びたい、実践的なスキルを身につけたいと考えている方向けに、おすすめの学習教材を紹介します。
これらの教材は、実際に僕がPythonの学習に使った教材になっています。

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

現役シリコンバレーエンジニアが教えるPython入門!応用では、データ解析、データーベース、ネットワーク、暗号化、並列化、テスト、インフラ自動化、キューイングシステム、非同期処理など盛り沢山の内容です!

ベネッセが運営する動画学習サイトUdemyで視聴することができる動画教材です。
(セールの時には¥1,500程度で買えます!)

Pythonは自由度が高くて雑に書いても動きますが、その分コードスタイルがおろそかになりがちです。
正しいコードスタイルを身に着けておかなければ、Pythonプログラマとして活躍することはあり得ません。
この教材は、グローバルスタンダードなコードスタイルを正しく学びながら、アルゴリズムやサーバー構築など幅広くPythonの活用方法を学習することができます。

Pythonの学習で間違えたくない方や、趣味レベルのスキルから一歩抜け出したい方におすすめです。

エキスパートPythonプログラミング改訂2版 Pythonプログラミングのベストプラクティスを伝授

本書は、Pythonを使って仕事をしている開発者が普段どのようなツールやテクニックを用いて仕事をしているのか、また開発者が実際に現場で用いているベストプラクティスについて解説した書籍です。本書を読むことで、先進的なPythonプログラマが日常的に使用している開発ノウハウを学ぶことができます。

こちらの書籍は、様々なユースケースに対するベストプラクティスを学習することができる書籍です。
Python2系と3系の違いについてもよく取り上げられますので、実質どちらのバージョンにも対応しているといえます。

Pythonをうまく使いこなせていない気がする方、初心者の殻を破りたい方におすすめです。

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