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 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

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

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

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

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

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

より実務に近いノウハウが盛りだくさんの書籍です。
Pythonエンジニアを目指す方は持っておいて損はないと思います。

-Python
-,

執筆者:


comment

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

関連記事

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

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

【Python】loggingの正しい使い方

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

【Python】pytestの使い方【テスト駆動開発】

今回は、テスト駆動開発の足掛けとして、pytestの使い方を紹介します。 テスト駆動開発とは、テストのことを第一に考えて実装する開発法のことです。アジャイル開発のように、設計・開発・テストを短く繰り返 …

【Kivy】一番簡単なKivyのインストール手順【Python】

Python用のGUIツールとして、海外では知名度が高いのがKivyです。Kivyは、マルチプラットフォーム対応ですので、Pythonでのアプリ開発の選択肢が大きく広がります。 Kivyの環境構築は、 …

【入門】Pythonを学習するうえでやってはいけないこと【アンチパターン】

今回は、Pythonを学習するうえでやってはいけないこと(アンチパターン)を紹介します。 そもそもプログラミング自体が初めてという方も、CやJavaでプログラミングの基礎は習得済という方にも、両方意識 …

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

yassan
インフラエンジニア。
独学でインフラ・クラウドについて学んでいます。
大阪 / 20代後半 / 決闘者 / FE / AWS-SAA

twitter: @yassan10787859