回答編集履歴

6

UrlRequest を利用したコードを追記

2021/07/07 23:50

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -55,3 +55,91 @@
55
55
   但し、結果を GUI に反映させる操作は、メインスレッド側で呼び出す必要があるので、
56
56
 
57
57
   ウィジェットにデータ kivy.clock.mainthread を使います。
58
+
59
+
60
+
61
+ ----
62
+
63
+
64
+
65
+
66
+
67
+ ```diff
68
+
69
+ # ファイル先頭
70
+
71
+ # 必要なモジュールの import / 不要なライブラリを削除
72
+
73
+ + from kivy.properties import StringProperty
74
+
75
+ + from kivy.network.urlrequest import UrlRequest
76
+
77
+ - import requests
78
+
79
+
80
+
81
+ # class InformationWidget 内
82
+
83
+
84
+
85
+ # KV InformationWidget 内で root.text で参照するプロパティを定義
86
+
87
+ + text = StringProperty()
88
+
89
+
90
+
91
+ # 何もしていないコンストラクタを削除 (省略可)
92
+
93
+ - def __init__(self, **kwargs):
94
+
95
+ - super().__init__(**kwargs)
96
+
97
+ - pass
98
+
99
+
100
+
101
+ # class WeatherApp 内
102
+
103
+ + def on_start(self):
104
+
105
+ + self.root.getWeather()
106
+
107
+
108
+
109
+ # kv ファイル --> 起動時に実行は App.on_start
110
+
111
+ - on_text: root.getWeather(text)
112
+
113
+ ```
114
+
115
+
116
+
117
+ ```python
118
+
119
+ def getWeather(self):
120
+
121
+ url = "http://api.openweathermap.org/data/2.5/weather?q=tokyo&appid=〇〇〇〇〇〇〇〇〇〇〇〇"
122
+
123
+ def callback(req, json_data):
124
+
125
+ weather = json_data['weather'][0]['main']
126
+
127
+ temp = int(json_data['main']['temp'] - 273.15)
128
+
129
+ min_temp = int(json_data['main']['temp_min'] - 273.15)
130
+
131
+ max_temp = int(json_data['main']['temp_max'] - 273.15)
132
+
133
+
134
+
135
+ # NOTE: root.text の更新
136
+
137
+ self.text = "今日の ..."
138
+
139
+
140
+
141
+ UrlRequest(url, callback)
142
+
143
+
144
+
145
+ ```

5

コード訂正

2021/07/07 23:50

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
   getWeather 関数内の text = "..." は、ローカル変数なので、UI には影響しません。
6
6
 
7
-  追記: インスタンス内からは self.text = "..."
7
+
8
8
 
9
9
 
10
10
 

4

追記2 ブロッキング操作について

2021/07/07 17:13

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -35,3 +35,23 @@
35
35
 
36
36
 
37
37
  関連: [KivyのRecycleViewをアプリ起動時に表示したい](https://teratail.com/questions/329500)
38
+
39
+
40
+
41
+ ----
42
+
43
+ 追記2: request.get は、メインスレッドで実行すると、
44
+
45
+ ラグや応答なしになったりすることがあります。
46
+
47
+
48
+
49
+ 対策はどちらか、
50
+
51
+ - kivy.network.urlrequest.UrlRequest を使う。
52
+
53
+ - request.get を使う場合は、別スレッドを使う。
54
+
55
+  但し、結果を GUI に反映させる操作は、メインスレッド側で呼び出す必要があるので、
56
+
57
+  ウィジェットにデータ kivy.clock.mainthread を使います。

3

追記: インスタンス内から使う場合のコード

2021/07/07 16:58

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -3,6 +3,8 @@
3
3
   `text: root.text` で表示したい場合、kivy の提供する「プロパティ」の仕組みを使います
4
4
 
5
5
   getWeather 関数内の text = "..." は、ローカル変数なので、UI には影響しません。
6
+
7
+  追記: インスタンス内からは self.text = "..."
6
8
 
7
9
 
8
10
 

2

on_text イベントについて訂正

2021/07/07 11:06

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- - Label の on_text イベント ⇛ ~~on_text は TextInput のイベントです。~~
9
+ - ~~Label の on_text イベント ⇛ on_text は TextInput のイベントです。~~
10
10
 
11
11
   適切なウィジェット/イベントを選択しましょう。
12
12
 

1

訂正: on_text 追記: アプリ起動時にコードを実行

2021/07/07 11:04

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- - Label の on_text イベント ⇛ on_text は TextInput のイベントです。
9
+ - Label の on_text イベント ⇛ ~~on_text は TextInput のイベントです。~~
10
10
 
11
11
   適切なウィジェット/イベントを選択しましょう。
12
12
 
@@ -21,3 +21,15 @@
21
21
   ここは、どのようにしたいのかが不可解です。
22
22
 
23
23
   getWeather はメソッドなので、第一引数self は必要です。
24
+
25
+
26
+
27
+ ----
28
+
29
+ 追記: アプリ起動時になにかする場合は、App.on_start
30
+
31
+ もしくは、対象のウィジェットのon_kv_postにコードを書く。
32
+
33
+
34
+
35
+ 関連: [KivyのRecycleViewをアプリ起動時に表示したい](https://teratail.com/questions/329500)