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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

2097閲覧

ある機器を通信させてtkinterで通信画面を作りデータを表示させる

macmac

総合スコア25

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/10/07 17:01

TCP通信と通信画面のpythonファイルが2個あります。
TCP通信の方は量1個目というデータを取得できるのですがこの取得したデータをもう一つの
通信画面のpythonファイルにtkinterを使用してメッセージボックスを作りそこに量1個目の
データを表示させたいです。

問題となっているのはTCP通信を while True: を使用してループを作って連続で通信させていること、通信画面ではtkinter画面に対しても  root.mainloop() となってループを使用していることで同時にループを使っているのでどうすれば1個のループでうまくできる方法が分かりません。
今の段階では通信画面.pyを動作させたときに import TCP通信が動作しtkinter画面を作る
ところまで到達できません。

もう1個の問題としてはTCP通信で得たデータをtkinterのメッセージボックスに表示させる
ために text=  にどのような変数などを入れたらいいかが分かりません。
下記にTCP通信と通信画面のコードを記述しますのでご教示をお願いします。
尚、TCP通信は動くプログラムであることを前提としています。

TCP通信.py

import

1import struct 2import time 3import codecs 4import sys 5TARGET_IP ='192.168.4.5' 6TARGET_PORT = 502 7BUFFER_SIZE = 512 8 9sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 10sock.connect((TARGET_IP, TARGET_PORT)) 11sock.settimeout(3.0) 12 13try: 14 print("Send modbus request ...") 15 transactionId = 502 16 protocolId = 0 17 len = 6 18 unitId = 0xff 19 functionCode = 3 # Read Input Status (0x02) 20 startRegister = 0x0100 21 data = 0x0001 # bit count 22 req = struct.pack('>3H 2B 2H', int(transactionId), int(protocolId), int(len), int(unitId), int(functionCode), int(startRegister), int(data)) 23 24 while True: 25 sock.send(req) 26 rec = sock.recv(BUFFER_SIZE) 27 28 print("TX: {0}".format(codecs.encode(req, 'hex_codec'))) 29 h="RX: {0}".format(codecs.encode(rec, 'hex_codec')) 30 print(h) 31 量1個目 = int(h[24:32], 16) 32 33 print("量1個目:", 量1個目) 34 35finally: 36 sock.close()

通信画面.py

import

1import tkinter 2import sys 3import TCP通信 4 5root = tkinter.Tk() 6root.title("TCP通信画面") #タイトルの入力 7root.geometry("400x400") #表示画面の大きさ(横x縦) 8 9#IPアドレス 10la1 = tkinter.Label(root,text="IPアドレス") 11la1.place(x=10,y=10) 12me1 = tkinter.Message(root,text="192.168.4.5",width=200,bg="white") 13me1.place(x=80,y=10) 14 15la量1個目 = tkinter.Label(root,text="量1個目") 16la量1個目.place(x=10,y=50) 17me量1個目 = tkinter.Message(root,text="TCP通信",width=200,bg="white") 18me量1個目.place(x=80,y=50) 19 20root.mainloop()

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

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

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

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

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

guest

回答1

0

恐らくmacmacさんはできる方だと思いますし、私がmacmacさんの書いたコードを触るのも大変なので、loop2つを同時に動かしてデータをやり取りできる最小サンプルを以下に書きます。

Python3

1from threading import Thread 2import queue 3import time 4 5def sub_loop(que): 6 while True: 7 time.sleep(1) 8 msg = que.get() # 一個だけ突っ込んだ一個を取り出す(もしQUEが空なら、QUEが詰まるまで待機しますので注意です。必要ならQueが空かの判定を挟んでください) 9 print("sub_loop",msg) 10 11que = queue.Queue(1) #キューに一個だけデータを入れる箱を用意する 12th = Thread(target=sub_loop,args=(que,),daemon=True) 13th.start() 14 15while True: 16 print("main") 17 que.put(time.time()) # キューに1つだけデータを突っ込む 18 time.sleep(0.5) 19

ループを2つ並行して回すには2つの技術がいります。

    1. ThreadingかProcessing(並行処理させる技術)

Threading:ハードウエアの大部分を共有させて並列処理させる方法(軽い処理向き)
Processing: ハードウエアの大部分を独立させて並行処理させる方法(重い処理向き)
調べると沢山出てきますので、ここではどっちが向いているかな?
くらいで捉えていただけると助かります。
両方やって試すのがベストですが、通信の受信であればThreadingでいいと思います。
※ThreadingもProcessingも可能な限りそっくりに作ってあるので、切り替えるのはImportの切り替えくらいで済むはずです。

    1. QueueかPipe(プロセスやスレッド間でデータを橋渡しさせる技術)

Queue: リストにデータを格納して、先入れ先出しさせるような技術です。中身を1つに絞ってしまえば、プロセス間通信に使えます。
Pipe:本当にプロセス間通信用に作られた技術です。オブジェクトを共有するイメージと思います。Lockだとかいろいろ概念があってとっつきにくいですが、Queueよりいろいろできると思います。

どの組み合わせでも動くと思いますが、一番シンプルなサンプルを掲載しましたので、こんな感じでメインのループを走らせる前にサブループを別のプロセスかスレッドで回せばいいな、と捉えていただければと思います。
※GUIを使おうとすると、GUIだけでもう一つスレッドあった方が良いと思います。


もう1個の問題としてはTCP通信で得たデータをtkinterのメッセージボックスに表示させる

ために text=  にどのような変数などを入れたらいいかが分かりません。

Tkのラベルは、textvariable=str(表示したい変数)でいけそうです。いかがでしょうか?

投稿2021/10/10 00:16

編集2021/10/10 00:23
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問