質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

3141閲覧

kivyでラベルにテキストが表示できない

gifzif

総合スコア0

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/30 05:22

編集2020/07/31 02:34

前提・実現したいこと

python初心者でKivyでGUIアプリを作っています。
テキストをラベルに表示したいのですがうまくいきません。
よろしくお願いします。

発生している問題・エラーメッセージ

class A()でTextWidget.text = 'aaa'としているのにラベルに表示されない。。 TextWidgetクラスとは別のクラスで変数にテキストを入れて表示させる方法を知りたいです。

該当のソースコード

python

1#-*- coding: utf-8 -*- 2 3from kivy.app import App 4from kivy.uix.widget import Widget 5 6from kivy.properties import StringProperty 7 8from kivy.core.text import LabelBase, DEFAULT_FONT 9from kivy.resources import resource_add_path 10 11 12class TextWidget(Widget): 13 text = StringProperty() 14 15 def __init__(self, **kwargs): 16 super(TextWidget, self).__init__(**kwargs) 17 self.text = '' 18 19 def buttonClicked(self): 20 A.aaa() 21 print(self.text) 22 23 def buttonClicked2(self): 24 self.B() 25 print(self.text) 26 27 def B(self): 28 self.text = 'bbb' 29 30class A(): 31 32 def aaa(): 33 TextWidget.text = 'aaa' 34 35class TestApp(App): 36 def __init__(self, **kwargs): 37 super(TestApp, self).__init__(**kwargs) 38 39 def build(self): 40 return TextWidget() 41 42TestApp().run()

kivy

1TextWidget: # ルートに追加 2 3<TextWidget>: 4 BoxLayout: 5 orientation: 'vertical' 6 size: root.size 7 # ラベル 8 Label: 9 id: label1 10 font_size: 68 11 text: root.text 12 13 BoxLayout: 14 Button: 15 id: button1 16 size_hint_x: 30 17 text: "A" 18 font_size: 68 19 on_press: root.buttonClicked() # ボタンをクリックした時 20 Button: 21 id: button1 22 size_hint_x: 30 23 text: "B" 24 font_size: 68 25 on_press: root.buttonClicked2() # ボタンをクリックした時

試したこと

テキスト自体は変数に入っているのは確認できました。

補足情報(FW/ツールのバージョンなど)

Python v3.6.5
Kivy v1.11.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

class A(): def aaa(): TextWidget.text = 'aaa'

class A()でTextWidget.text = 'aaa'としているのにラベルに表示されない。。

TextWidget.text は、「クラス変数」です。
ラベルに表示するには「インスタンス変数」の .text に代入する必要があります。

TextWidgetクラスとは別のクラスで変数にテキストを入れて表示させる方法を知りたいです。

あまり一般的な方法ではありませんが、
現状のコードを動かすためには、以下のように TextWidget のインスタンスを渡します。

python

1# 呼び出し側 2 3class TextWidget(Widget): 4 # ~略~ 5 6 def buttonClicked(self): 7 A.aaa(self) 8 print(self.text) 9 10class A(): 11 @staticmethod 12 def aaa(root): 13 root.text = 'aaa'

クラスで def aaa(): と、インスタンス変数 self を使わない場合は、
staticmethod として定義します。
(この場合なくても動きますが、通常のメソッドと区別するため)


他の方法、起動中のインスタンスをApp から辿る方法

python

1class A(): 2 def aaa(): 3 TestApp.get_running_app().root.text = "aaa"

これもあまり多用する方法では有りません。

どのような目的で別クラスにしたいのかによって、
適切な設計は変わってきますが、

Python側で、他のクラスの要素にアクセスするためには、
とにかく、そのインスタンスを得る必要があります。

まずは、クラスとインスタンスの区別について調べてみてください。

設計的には、
「TextWidgetクラスとは別のクラスで変数にテキストを入れて」は避けたほうが良いです。
その別クラスはTextWidgetクラスとセットでしか使えなくなってしまいます。
→ テストがしにくくなる。再利用性が低くなる。といったデメリット。

「別クラスからは表示したいテキストをreturnで返し、
呼び出し元のTextWidgetクラス側で表示」を検討してみてください。

投稿2020/08/03 17:10

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問