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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3874閲覧

pysimpleGUIでのグラフの更新

buturisuki

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/18 15:53

前提・実現したいこと

pysimpleguiを使用してアプリを作成しようとしています。while文でデータを取得して取得したデータをプロットするようにしたいです。プロット自体は出来るのですが最後に一括でされてしまいます。本来はデータを取得したら取得したものをすぐにプロットしてほしいのですがどうしてもできないです。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python

1# ============================================================================= 2# ライブラリをインポート 3# ============================================================================= 4 5import PySimpleGUI as sg 6import matplotlib.pyplot as plt 7import numpy as np 8from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 9import sys 10import pyvisa # PyVisa info @ http://PyVisa.readthedocs.io/en/stable/ 11import time 12import scipy 13import glob 14import os 15import threading 16print('OK') 17 18# ============================================================================= 19# テーマの設定 20# ============================================================================= 21 22sg.theme("Dark Blue3") 23#sg.theme("TanBlue") 24size = (10,1) 25font = ("meiryo", 10) 26 27# ================================================================================= 28# GUIがぼやけるのを防ぐ 29# ================================================================================= 30def make_dpi_aware(): 31 import ctypes 32 import platform 33 if int(platform.release()) >= 8: 34 ctypes.windll.shcore.SetProcessDpiAwareness(True) 35make_dpi_aware() 36 37def draw_figure(canvas, figure): 38 fig_cav = FigureCanvasTkAgg(figure, canvas) 39 fig_cav.draw() 40 fig_cav.get_tk_widget().pack(side='top', fill='both', expand=1) 41 return fig_cav 42 43layout = [[sg.Button("実行", font = font, key = "btn"),sg.Canvas(key="CANVAS"),sg.Text(key = "time")] 44] 45 46window = sg.Window("Pulsed-ESR", layout, size = (1500,1000), finalize=True, resizable = True) 47fig = plt.figure(figsize=(10, 10)) 48ax = fig.add_subplot(111) 49ax.set_title("DATA") 50ax.set_xlabel('point') 51ax.set_ylabel('Intensity [a.u.]') 52plt.tight_layout() 53fig_cav = draw_figure(window['CANVAS'].TKCanvas, fig) 54while True: 55 event, value = window.read() 56 if event == None: 57 break 58 # 読込ボタンを押したら 59 if event == 'btn': 60 data=0 61 fn = '5.5395Tre.csv' 62 data=np.loadtxt(fn, delimiter=',') 63 time_axis=data[:,0] 64 cospart=data[:,21:41] 65 sinpart=data[:,42:62] 66 cos_part = np.zeros((2**14-1,20)) 67 sin_part = np.zeros((2**14-1,20)) 68 i = 0 69 while i < 20: 70 71 starttime = time.time() 72 cos_part[:,i] = np.delete(cospart[:,i], 2**14-1, axis = 0) 73 sin_part[:,i] = np.delete(sinpart[:,i], 2**14-1, axis = 0) 74 75 76 #ax.cla() 77 ax.set_title("DATA") 78 ax.set_xlabel('point') 79 ax.set_ylabel('Intensity [a.u.]') 80 ax.plot(cos_part[:,i]+0.15*i,label = "sin_part") 81 ax.plot(sin_part[:,i]-0.15*i,label = "sin_part") 82 fig_cav.draw() 83 84 85 86 87 time.sleep(0.5) 88 i = i + 1 89 print(i) 90window.close()

試したこと

threadを使用しようとしましたがうまく動きませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

draw() の直後に flush_events() を実行します。

python

1 ax.set_title("DATA") 2 ax.set_xlabel('point') 3 ax.set_ylabel('Intensity [a.u.]') 4 ax.plot(cos_part[:,i]+0.15*i,label = "cos_part") 5 ax.plot(sin_part[:,i]-0.15*i,label = "sin_part") 6 fig_cav.draw() 7 fig_cav.flush_events()

drawing

投稿2021/11/19 15:50

melian

総合スコア20655

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

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

buturisuki

2021/11/20 04:33

ありがとうございました。とてもたすかりました。
teamikl

2021/11/21 01:56

現状では実行ボタンしかない為、差し支えないかもしれませんが while i < 20 のループが実行されている間、他のイベント処理がされないはずです。 (ウィンドウの閉じるボタン等は、matplotlibのバックエンド次第では反応しますが) flush_events() は、matplotlib のイベントループを動かす為なので、グラフについては解消しますが PySimpleGUI での GUIを稼働させるには window.read() を呼び出す必要があるので、 PySimpleGUI の提供するタイマー (timeoutイベント) の利用をお勧めします。 tkinter 等、他のGUIを直接扱う場合は、flush_events() でも大丈夫です。 (※matplotlib のバックエンドと同じGUIを使っている場合に限る)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問