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

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

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

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

728閲覧

tkinterでクリックした後の送信logがtext boxに表示されない

trafalbad

総合スコア303

Python 3.x

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2022/05/18 14:44

udp通信でclient側から時刻を送信します。
受け取るserverはtkinterのGUI上でスクロールバーに徐々に表示されていくようになっています。

以下のように実行しても、コンソール上では動作しているのですが、
GUIのスクロールバーに logが表示されず、終了のためにSfit+commad+Rを押して例外処理でKeyboardInterrupt:を通ったときに一瞬表示されます。

おそらく表示用のtext boxがupdateされていないのが原因のような気がするのですが、解決策を教えていただけないでしょうか?よろしくお願いします。

client.py

python

1import socket 2import datetime 3 4M_SIZE = 1024 5serv_address = ('127.0.0.1', 8890) 6sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 7 8 9while True: 10 try: 11 message = now = str(datetime.datetime.now()) 12 send_len = sock.sendto(message.encode('utf-8'), serv_address) 13 # ※sendtoメソッドはkeyword arguments(address=serv_addressのような形式)を受け付けないので注意 14 15 # ③Serverからのmessageを受付開始 16 print('Waiting response from Server') 17 rx_meesage, addr = sock.recvfrom(M_SIZE) 18 print(f"[Server]: {rx_meesage.decode(encoding='utf-8')}") 19 20 21 except KeyboardInterrupt: 22 print('closing socket') 23 sock.close() 24 print('done') 25 break

server.py

python

1from tkinter import messagebox, ttk, Text, filedialog 2import tkinter as tk 3import os 4import time 5import datetime 6import socket 7 8 9M_SIZE = 1024 10class Application(tk.Frame): 11 def __init__(self, host, port, master): 12 super().__init__(master) 13 14 self.master.geometry("1280x768") 15 self.master.title("Tkinter with Video Streaming and Capture") 16 self.locaddr = (host, port) 17 self.create_socket() 18 self.create_widgets() 19 20 21 def create_socket(self): 22 self.sock = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM) 23 self.sock.bind(self.locaddr) 24 25 def create_widgets(self): 26 frame = ttk.Frame(self.master, padding=10) 27 frame.grid() 28 refer_button = ttk.Button(frame, text=u'出力ボタン', command=self.server) 29 refer_button.grid(row=3, column=1) 30 self.log = Text(self.master, state='disabled',borderwidth=5, width=70, height=30, wrap='none', padx=10,pady=10) 31 ys = ttk.Scrollbar(self.master, orient = 'vertical', command = self.log.yview) 32 33 self.log['yscrollcommand'] = ys.set 34 self.log.grid(row=4, column=0) 35 ys.grid(column = 1, row = 4, sticky = 'ns') 36 37 def writeToLog(self, msg): 38 self.log['state'] = 'normal' 39 self.log.insert('end', str(msg)+'\n') 40 self.log['state'] = 'disabled' 41 42 def server(self): 43 while True: 44 try: 45 print('Waiting message') 46 message, cli_addr = self.sock.recvfrom(M_SIZE) 47 message = message.decode(encoding='utf-8') 48 self.writeToLog(message) 49 print(f'Received message is [{message}]') 50 time.sleep(1) 51 52 print('Send response to Client') 53 self.sock.sendto('Success to receive message'.encode(encoding='utf-8'), cli_addr) 54 55 except KeyboardInterrupt: 56 self.sock.close() 57 break 58 59 60 61 62if __name__ == "__main__": 63 root = tk.Tk() 64 app = Application('127.0.0.1', 8890, root)#Inherit 65 app.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

一つの方法として、update() を使う方法があります。

python

1 def writeToLog(self, msg): 2 self.log['state'] = 'normal' 3 self.log.insert('end', str(msg)+'\n') 4 self.log.update() ## update status 5 self.log['state'] = 'disabled'

投稿2022/05/18 15:31

melian

総合スコア19771

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

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

trafalbad

2022/05/18 15:54

解決できました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問