質問編集履歴
1
分からない点のプログラムを簡潔にしました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,14 +1,10 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
2
|
|
3
|
+
python初心者でKivyでGUIアプリを作っています。
|
3
4
|
|
5
|
+
テキストをラベルに表示したいのですがうまくいきません。
|
4
6
|
|
5
|
-
|
7
|
+
よろしくお願いします。
|
6
|
-
|
7
|
-
サーバーから返信が来た時その内容のテキストをラベルに表示したいのですがうまくいきません。
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
8
|
|
13
9
|
### 発生している問題・エラーメッセージ
|
14
10
|
|
@@ -16,7 +12,9 @@
|
|
16
12
|
|
17
13
|
```
|
18
14
|
|
15
|
+
class A()でTextWidget.text = 'aaa'としているのにラベルに表示されない。。
|
16
|
+
|
19
|
-
|
17
|
+
TextWidgetクラスとは別のクラスで変数にテキストを入れて表示させる方法を知りたいです。
|
20
18
|
|
21
19
|
```
|
22
20
|
|
@@ -28,19 +26,7 @@
|
|
28
26
|
|
29
27
|
```python
|
30
28
|
|
31
|
-
#
|
29
|
+
#-*- coding: utf-8 -*-
|
32
|
-
|
33
|
-
import websocket
|
34
|
-
|
35
|
-
try:
|
36
|
-
|
37
|
-
import thread
|
38
|
-
|
39
|
-
except ImportError:
|
40
|
-
|
41
|
-
import _thread as thread
|
42
|
-
|
43
|
-
import time
|
44
30
|
|
45
31
|
|
46
32
|
|
@@ -60,12 +46,6 @@
|
|
60
46
|
|
61
47
|
|
62
48
|
|
63
|
-
# デフォルトに使用するフォントを変更する
|
64
|
-
|
65
|
-
resource_add_path('./fonts')
|
66
|
-
|
67
|
-
LabelBase.register(DEFAULT_FONT, 'mplus-2c-regular.ttf') #日本語が使用できるように日本語フォントを指定する
|
68
|
-
|
69
49
|
|
70
50
|
|
71
51
|
class TextWidget(Widget):
|
@@ -84,115 +64,33 @@
|
|
84
64
|
|
85
65
|
def buttonClicked(self):
|
86
66
|
|
87
|
-
|
67
|
+
A.aaa()
|
88
68
|
|
89
|
-
ws_client.ws.send(input_data)
|
90
|
-
|
91
|
-
|
69
|
+
print(self.text)
|
92
70
|
|
93
71
|
|
94
72
|
|
95
|
-
|
73
|
+
def buttonClicked2(self):
|
74
|
+
|
75
|
+
self.B()
|
76
|
+
|
77
|
+
print(self.text)
|
96
78
|
|
97
79
|
|
98
80
|
|
81
|
+
def B(self):
|
82
|
+
|
99
|
-
|
83
|
+
self.text = 'bbb'
|
100
84
|
|
101
85
|
|
102
86
|
|
103
|
-
|
87
|
+
class A():
|
104
88
|
|
105
89
|
|
106
90
|
|
107
|
-
|
91
|
+
def aaa():
|
108
92
|
|
109
|
-
websocket.enableTrace(False)
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
# WebSocketAppクラスを生成
|
114
|
-
|
115
|
-
# 関数登録のために、ラムダ式を使用
|
116
|
-
|
117
|
-
self.ws = websocket.WebSocketApp(host_addr,
|
118
|
-
|
119
|
-
on_message = lambda ws, msg: self.on_message(ws, msg),
|
120
|
-
|
121
|
-
on_error = lambda ws, msg: self.on_error(ws, msg),
|
122
|
-
|
123
|
-
on_close = lambda ws: self.on_close(ws))
|
124
|
-
|
125
|
-
self.ws.on_open = lambda ws: self.on_open(ws)
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
# メッセージ受信に呼ばれる関数
|
130
|
-
|
131
|
-
def on_message(self, ws, message):
|
132
|
-
|
133
|
-
print("receive : {}".format(message))
|
134
|
-
|
135
|
-
|
93
|
+
TextWidget.text = 'aaa'
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
# エラー時に呼ばれる関数
|
140
|
-
|
141
|
-
def on_error(self, ws, error):
|
142
|
-
|
143
|
-
print(error)
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
# サーバーから切断時に呼ばれる関数
|
148
|
-
|
149
|
-
def on_close(self, ws):
|
150
|
-
|
151
|
-
print("### closed ###")
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
# サーバーから接続時に呼ばれる関数
|
156
|
-
|
157
|
-
def on_open(self, ws):
|
158
|
-
|
159
|
-
print("### open ###")
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
# サーバーから接続時にスレッドで起動する関数
|
164
|
-
|
165
|
-
def run(self, *args):
|
166
|
-
|
167
|
-
while True:
|
168
|
-
|
169
|
-
time.sleep(0.1)
|
170
|
-
|
171
|
-
input_data = input("send data:")
|
172
|
-
|
173
|
-
print(type(input_data))
|
174
|
-
|
175
|
-
self.ws.send(input_data)
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
self.ws.close()
|
180
|
-
|
181
|
-
print("thread terminating...")
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
# websocketクライアント起動
|
186
|
-
|
187
|
-
def run_forever(self):
|
188
|
-
|
189
|
-
self.ws.run_forever()
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
HOST_ADDR = "ws://xxx.xxx.xxx.xxx:yyy/"
|
194
|
-
|
195
|
-
ws_client = Websocket_Client(HOST_ADDR)
|
196
94
|
|
197
95
|
|
198
96
|
|
@@ -206,11 +104,7 @@
|
|
206
104
|
|
207
105
|
def build(self):
|
208
106
|
|
209
|
-
thread.start_new_thread(ws_client.run_forever, ())
|
210
|
-
|
211
107
|
return TextWidget()
|
212
|
-
|
213
|
-
|
214
108
|
|
215
109
|
|
216
110
|
|
@@ -218,7 +112,9 @@
|
|
218
112
|
|
219
113
|
```
|
220
114
|
|
115
|
+
|
116
|
+
|
221
|
-
```
|
117
|
+
```kivy
|
222
118
|
|
223
119
|
TextWidget: # ルートに追加
|
224
120
|
|
@@ -246,17 +142,17 @@
|
|
246
142
|
|
247
143
|
BoxLayout:
|
248
144
|
|
249
|
-
|
145
|
+
Button:
|
250
146
|
|
251
|
-
id: t
|
147
|
+
id: button1
|
252
148
|
|
253
|
-
size_hint_x:
|
149
|
+
size_hint_x: 30
|
150
|
+
|
151
|
+
text: "A"
|
254
152
|
|
255
153
|
font_size: 68
|
256
154
|
|
257
|
-
focus: True
|
258
|
-
|
259
|
-
on_
|
155
|
+
on_press: root.buttonClicked() # ボタンをクリックした時
|
260
156
|
|
261
157
|
Button:
|
262
158
|
|
@@ -264,126 +160,20 @@
|
|
264
160
|
|
265
161
|
size_hint_x: 30
|
266
162
|
|
267
|
-
text: "
|
163
|
+
text: "B"
|
268
164
|
|
269
165
|
font_size: 68
|
270
166
|
|
271
|
-
on_press: root.buttonClicked() # ボタンをクリックした時
|
167
|
+
on_press: root.buttonClicked2() # ボタンをクリックした時
|
272
|
-
|
273
|
-
```
|
274
|
-
|
275
|
-
```python
|
276
|
-
|
277
|
-
# -*- coding: utf-8 -*-
|
278
|
-
|
279
|
-
from websocket_server import WebsocketServer
|
280
|
-
|
281
|
-
import logging
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
class Websocket_Server():
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
def __init__(self, host, port):
|
290
|
-
|
291
|
-
self.server = WebsocketServer(port, host=host, loglevel=logging.DEBUG)
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
# クライアント接続時に呼ばれる関数
|
296
|
-
|
297
|
-
def new_client(self, client, server):
|
298
|
-
|
299
|
-
print("new client connected and was given id {}".format(client['id']))
|
300
|
-
|
301
|
-
# 全クライアントにメッセージを送信
|
302
|
-
|
303
|
-
self.server.send_message_to_all("hey all, a new client has joined us")
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
# クライアント切断時に呼ばれる関数
|
308
|
-
|
309
|
-
def client_left(self, client, server):
|
310
|
-
|
311
|
-
print("client({}) disconnected".format(client['id']))
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
# クライアントからメッセージを受信したときに呼ばれる関数
|
316
|
-
|
317
|
-
def message_received(self, client, server, message):
|
318
|
-
|
319
|
-
print(type(message))
|
320
|
-
|
321
|
-
message_str = message.encode('utf_8')
|
322
|
-
|
323
|
-
print(type(message_str))
|
324
|
-
|
325
|
-
print("client({}) said: {}".format(client['id'], message_str))
|
326
|
-
|
327
|
-
# 全クライアントにメッセージを送信
|
328
|
-
|
329
|
-
self.server.send_message_to_all(message_str)
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
# サーバーを起動する
|
334
|
-
|
335
|
-
def run(self):
|
336
|
-
|
337
|
-
# クライアント接続時のコールバック関数にself.new_client関数をセット
|
338
|
-
|
339
|
-
self.server.set_fn_new_client(self.new_client)
|
340
|
-
|
341
|
-
# クライアント切断時のコールバック関数にself.client_left関数をセット
|
342
|
-
|
343
|
-
self.server.set_fn_client_left(self.client_left)
|
344
|
-
|
345
|
-
# メッセージ受信時のコールバック関数にself.message_received関数をセット
|
346
|
-
|
347
|
-
self.server.set_fn_message_received(self.message_received)
|
348
|
-
|
349
|
-
self.server.run_forever()
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
IP_ADDR = "xxx.xxx.xxx.xxx" # IPアドレスを指定
|
354
|
-
|
355
|
-
PORT=yyyy # ポートを指定
|
356
|
-
|
357
|
-
ws_server = Websocket_Server(IP_ADDR, PORT)
|
358
|
-
|
359
|
-
ws_server.run()
|
360
168
|
|
361
169
|
```
|
362
170
|
|
363
171
|
### 試したこと
|
364
172
|
|
365
|
-
|
366
|
-
|
367
|
-
kivyのラベルがTextWidgetのクラス変数textを参照しているのでWebsocket_Clientクラスのon_message関数でTextWidget.text = messageとすればできると思いましたができませんでした。
|
368
|
-
|
369
|
-
|
173
|
+
テキスト自体は変数に入っているのは確認できました。
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
174
|
|
375
175
|
### 補足情報(FW/ツールのバージョンなど)
|
376
176
|
|
377
177
|
Python v3.6.5
|
378
178
|
|
379
179
|
Kivy v1.11.1
|
380
|
-
|
381
|
-
webソケットで必要なモジュールの参考にしたサイト
|
382
|
-
|
383
|
-
サーバー
|
384
|
-
|
385
|
-
[www.raspberrypirulo.net/entry/websocket-server](https://www.raspberrypirulo.net/entry/websocket-server)
|
386
|
-
|
387
|
-
クライアント
|
388
|
-
|
389
|
-
[https://www.raspberrypirulo.net/entry/websocket-client](https://www.raspberrypirulo.net/entry/websocket-client)
|