プログラムの起動時にKivyのウィジェットのいくつかの値を初期化しようとしていますが、成功しません。簡略化されたPythonコードは次のとおりです。
inital_text = "init text"
class MainApp(App):
def initialize_widgets(self):
self.root.ids.my_label.text = initial_text
if __name__ == '__main__':
MainApp().run()
MainApp.initialize_widgets(App)
そして、kvファイルからの関連部分は次のとおりです。
Label:
id: my_label
text: "default text"
プログラムを実行すると、ラベルに「デフォルトのテキスト」と表示されます。終了すると、次のエラーが発生します。
line 5, in initialize_widgets
self.root.ids.my_label.text = initial_text
AttributeError: type object 'App' has no attribute 'root'
私は他の回避策を試しましたが、いくつかは非常に絶望的なものでしたが、成功しませんでした。
on_startイベントを使用して、プログラムの開始時にラベルのテキストを初期化します。以下の例では、Clock.schedule_onceイベントが追加され、初期値とその後の変更が示されています。
この例では、ルートウィジェットはラベルウィジェット(root)であり、ルートのディクショナリ(root.ids)は空です。id: my_textinput
ルートの子として追加された、が付いた別のウィジェットがある場合、ルートのディクショナリには1つのID、つまりmy_textinputが含まれます。Aprint(self.root.ids)
はこれを示します。
自己-キーワード自己参照「現在のウィジェットのインスタンス」、すなわちアプリケーション。
kvファイルが処理されると、idでタグ付けされたすべてのウィジェットへのweakrefがルートウィジェットのidsディクショナリに追加されます。
from kivy.app import App
initial_text = "init text"
class MainApp(App):
def on_start(self):
self.root.text = initial_text
if __name__ == '__main__':
MainApp().run()
from kivy.app import App
from kivy.clock import Clock
initial_text = "init text"
class MainApp(App):
def on_start(self):
Clock.schedule_once(self.initialize_widgets, 5)
def initialize_widgets(self, dt):
self.root.text = initial_text
if __name__ == '__main__':
MainApp().run()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加