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

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

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

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

Python

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

Q&A

1回答

2195閲覧

kivyを使って起動時に関数を実行したい

jimajima_jinjin

総合スコア2

Kivy

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

Python

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

0グッド

0クリップ

投稿2021/07/06 08:15

apiを使って東京の天気情報を取得し、その結果を表示するアプリを自作しています。天気情報を取得するところまでは順調に進んだのですが下のコードを実行したときに'InformationWidget' object has no attribute 'text'というエラーが発生してしまいます。おそらく23行目のgetWeather関数が正しく実行されてないのではと思ったのですがどこを直せばよいのでしょうか。

python

1#-*- coding: utf-8 -*_ 2import kivy 3from kivy.app import App 4from kivy.config import Config 5from kivy.core import text 6#ウィンドウズのサイズ設定 7Config.set('graphics', 'width', '640') 8Config.set('graphics', 'height', '480') 9 10from kivy.uix.widget import Widget 11#from kivy.uix.textinput import TextInput 12from kivy.uix.label import Label 13import requests 14#必要であれば 15import pprint 16 17class InformationWidget(Widget): 18 def __init__(self, **kwargs): 19 super().__init__(**kwargs) 20 pass 21 22 #apiで天気情報を取得するgetWeather関数 23 def getWeather(): 24 api = "http://api.openweathermap.org/data/2.5/weather?q=tokyo&appid=〇〇〇〇〇〇〇〇〇〇〇〇" 25 json_data = requests.get(api).json() 26 weather = json_data['weather'][0]['main'] 27 temp = int(json_data['main']['temp'] - 273.15) 28 min_temp = int(json_data['main']['temp_min'] - 273.15) 29 max_temp = int(json_data['main']['temp_max'] - 273.15) 30 31 #取得した天気情報を表示 32 text = "今日の{}の天気は \n 最高気温: {}℃ \n 最低気温: {}℃".format("tokyo", max_temp, min_temp) 33 34class WeatherApp(App): 35 def __init__(self, **kwargs): 36 super().__init__(**kwargs) 37 self.title = "WeatherPredict" 38 39 40if __name__=='__main__': 41 WeatherApp().run()

kivy

1InformationWidget: 2 3<InformationWidget>: 4 canvas.before: 5 Color: 6 rgba: 0.6, 0.6, 0.6, 1 7 Rectangle: 8 pos: self.pos 9 size: self.size 10 11 Label: 12 on_text: root.getWeather(text) 13 text: root.text

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

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

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

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

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

guest

回答1

0

  • StringProperty を使う。

 text: root.text で表示したい場合、kivy の提供する「プロパティ」の仕組みを使います
getWeather 関数内の text = "..." は、ローカル変数なので、UI には影響しません。

  • Label の on_text イベント ⇛ on_text は TextInput のイベントです。

 適切なウィジェット/イベントを選択しましょう。

  • def getWeather() 引数の不一致

 getWeather(text) は引数を取っていますが、
text には、getWeather の結果を入れてるはずなので、
ここは、どのようにしたいのかが不可解です。
getWeather はメソッドなので、第一引数self は必要です。


追記: アプリ起動時になにかする場合は、App.on_start
もしくは、対象のウィジェットのon_kv_postにコードを書く。

関連: KivyのRecycleViewをアプリ起動時に表示したい


追記2: request.get は、メインスレッドで実行すると、
ラグや応答なしになったりすることがあります。

対策はどちらか、

  • kivy.network.urlrequest.UrlRequest を使う。
  • request.get を使う場合は、別スレッドを使う。

 但し、結果を GUI に反映させる操作は、メインスレッド側で呼び出す必要があるので、
ウィジェットにデータ kivy.clock.mainthread を使います。


diff

1# ファイル先頭 2# 必要なモジュールの import / 不要なライブラリを削除 3+ from kivy.properties import StringProperty 4+ from kivy.network.urlrequest import UrlRequest 5- import requests 6 7# class InformationWidget 内 8 9# KV InformationWidget 内で root.text で参照するプロパティを定義 10+ text = StringProperty() 11 12# 何もしていないコンストラクタを削除 (省略可) 13- def __init__(self, **kwargs): 14- super().__init__(**kwargs) 15- pass 16 17# class WeatherApp 内 18+ def on_start(self): 19+ self.root.getWeather() 20 21# kv ファイル --> 起動時に実行は App.on_start 22- on_text: root.getWeather(text)

python

1 def getWeather(self): 2 url = "http://api.openweathermap.org/data/2.5/weather?q=tokyo&appid=〇〇〇〇〇〇〇〇〇〇〇〇" 3 def callback(req, json_data): 4 weather = json_data['weather'][0]['main'] 5 temp = int(json_data['main']['temp'] - 273.15) 6 min_temp = int(json_data['main']['temp_min'] - 273.15) 7 max_temp = int(json_data['main']['temp_max'] - 273.15) 8 9 # NOTE: root.text の更新 10 self.text = "今日の ..." 11 12 UrlRequest(url, callback) 13

投稿2021/07/07 04:21

編集2021/07/07 23:50
teamikl

総合スコア8664

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

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

gottadiveintopy

2021/07/07 08:35

code上にあるon_textはtextというpropertyを持っているwidgetに対してなら何にでも可能な書き方なのでLabelでも可能ですね。それでも今回の場合は使うべきじゃないと思いますが。
teamikl

2021/07/07 10:49

補足解説ありがとうございます。on_text イベントは把握漏れでした。 on_text -> getWeather 内で text 変更 -> on_text になりそう?なので、 getWeather のトリガー自体を別にした方が良さそうですね。 それで、「起動時に関数を実行したい」だったのかな。
teamikl

2021/07/07 11:03

訂正、把握漏れてはなくて、私の(kivyの仕組みの)勘違いでした。 on_プロパティ名 というイベントが自動的に使えるようになるのですね。
gottadiveintopy

2021/07/07 11:35

> on_text -> getWeather 内で text 変更 -> on_text になりそう? 何処かでそうなる可能性はありそうですね、現状は大丈夫ですが。 > それで、「起動時に関数を実行したい」だったのかな。 私は「アプリ起動時に一度だけgetWeather()を実行したい」ものだと思ってます。のでon_text(Labelのtextが変化する度に行いたい処理を書くところ)を使うべきじゃないと考えてます。 > on_プロパティ名 というイベントが自動的に使えるようになるのですね。 です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問