質問編集履歴

1

分からない点のプログラムを簡潔にしました。

2020/07/31 02:34

投稿

gifzif
gifzif

スコア0

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
- Kivyでチャットアプリを作っています。
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
- # -*- coding: utf-8 -*-
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
- input_data = self.ids["text_box"].text
67
+ A.aaa()
88
68
 
89
- ws_client.ws.send(input_data)
90
-
91
- #print(self.text)
69
+ print(self.text)
92
70
 
93
71
 
94
72
 
95
- textWidget = TextWidget()
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
- class Websocket_Client():
83
+ self.text = 'bbb'
100
84
 
101
85
 
102
86
 
103
- def __init__(self, host_addr):
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
-     TextWidget.text = message
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
- ```Kivy
117
+ ```kivy
222
118
 
223
119
  TextWidget: # ルートに追加
224
120
 
@@ -246,17 +142,17 @@
246
142
 
247
143
  BoxLayout:
248
144
 
249
- TextInput:
145
+ Button:
250
146
 
251
- id: text_box
147
+ id: button1
252
148
 
253
- size_hint_x: 70
149
+ size_hint_x: 30
150
+
151
+ text: "A"
254
152
 
255
153
  font_size: 68
256
154
 
257
- focus: True
258
-
259
- on_text_validate: root.buttonClicked()
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: "OK"
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)