前提・実現したいこと
・Tkinterで実行ボタン、閉じるボタン、テキストボックスから成るGUIを構成
・実行ボタンを押すと、1秒に1回リアルタイムにテキストが出力されるようにしたい
(例えばサーバから1秒に1回データを取得し、結果を表示したい)
発生している問題
・文字を出力するループ(今回の場合、while i < 3)が終了するまで文字が出力されない
→リアルタイムという条件に合わない
・文字がまとめて出力されてしまう
→1秒に1回出力という条件に合わない
該当のソースコード
Python
1# -*- coding: utf-8 -*- 2 3from tkinter import * 4import tkinter as tk 5from tkinter import ttk 6import time 7 8#テキストボックスに文字を出力する関数です 9#文字を出力->改行->自動スクロール 10def print_text(text): 11 tx.insert(END, text) 12 tx.insert(END, "\n") 13 tx.see(END) 14 15#サーバに接続する関数ですが、質問簡単化のために割愛します 16#実行は1回のみです 17def connect_server(): 18 pass 19 20#サーバから文字列を取得する関数ですが、質問簡単化のために割愛します 21#実行は繰り返し行われます 22def get_text_from_server(): 23 pass 24 25#実行ボタンを押した際に実行されます 26#処理内容は以下の通りです 27#サーバに接続->文字列を取得->特定の文字列でなければwhile内を実行(例:end以外なら実行) 28#whileの中身:文字列を表示->1秒待機 29def conductMain(): 30 connect_server() 31 i = 0 32 #実際はサーバから特定の文字列を取得した際に終了しますが、 33 #今回は簡単化のために3回実行したら終了するようにしています 34 while i < 3: 35 print_text(i) 36 time.sleep(1) 37 i += 1 38 39if __name__ == "__main__": 40 41 root = Tk() 42 root.title("サンプル") 43 44 frame3 = ttk.Frame(root, padding=10) 45 frame3.grid(row=0,column=1,sticky=W) 46 47 button1 = ttk.Button(frame3, text="実行", command=conductMain) 48 button1.pack(fill = "x", padx=30, side = "left") 49 50 button2 = ttk.Button(frame3, text=("閉じる"), command=root.quit) 51 button2.pack(fill = "x", padx=30, side = "left") 52 53 frame4 = ttk.Frame(root, padding = 10) 54 frame4.grid(row=2,column=1,sticky=E) 55 56 sc = tk.Scrollbar(frame4) 57 sc.pack(side = RIGHT, fill = "y") 58 59 tx = tk.Text(frame4, width = 48, height = 5) 60 tx.pack() 61 62 tx["yscrollcommand"] = sc.set 63 sc["command"] = tx.yview 64 65 root.mainloop()
補足情報(FW/ツールのバージョンなど)
環境
・Windows10(64bit Home)
・Spyder(Python 3.7)
お手数ですが、上述の質問へご回答いただければ幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/24 12:52 編集
2020/08/24 13:00 編集
2020/08/24 13:16