![見出し画像](https://assets.st-note.com/production/uploads/images/138094763/rectangle_large_type_2_90d60ade2317ae6154a983d429571f46.jpeg?width=800)
matplotlibを試す(2)
(Python学習初心者の試行錯誤・備忘録です)
メインのウインドウ内で状況が進んだとき、グラフウィンドウに表示しているグラフの内容がそれに応じて更新されるか?といったことを試したい。
そもそも一度表示したグラフを閉じられるのか試すと・・
import matplotlib.pyplot as plt
import time
x = [1, 2, 3, 4, 5]
y = [0, 0, 0, 0, 8]
labels = ['レベル0', 'レベル1', 'レベル2', 'レベル3', '合計']
plt.title("学習進捗", fontname="MS Gothic")
plt.bar(x, y, width=0.5, linewidth=1, tick_label=labels)
plt.rcParams["font.sans-serif"]="MS Gothic"
plt.show()
time.sleep(10)
plt.close()
これで、10秒間表示してその後閉じる、と言った操作ができるかな?と思ったら
![](https://assets.st-note.com/img/1713754125408-bxTLmsyZYy.png?width=800)
たら、このグラフは表示されますが、10秒経っても閉じません。(制御が帰ってきません。)右上の×で閉じるしかありません。
奥村 晴彦先生のこちらの記事を参考にさせていただいて、
plt.show()⇒plt.show(block=False) これがキモかと
#抜粋
plt.show(block=False)
time.sleep(10)
plt.close()
と書き換えてみました。これだと確かにワクが10秒表示されてから、閉じるけれど表示内容が真っ白。
![](https://assets.st-note.com/img/1713754607994-2slwHUxW8C.png?width=800)
time.sleep(10)が描画を邪魔してしまうみたいです。sleepはまずいみたい。
◎試行錯誤で、こう書いたら、思ったとおりの動作になりました。
#抜粋
plt.show(block=False)
plt.pause(10)
ちゃんとグラフが表示され、10秒経ったら消えます。pauseを入れないと一瞬で消えます。
奥村先生の記事には「もっと楽な方法」として、あらかじめ plt.ion() で「インタラクティブモード」にするというやり方が紹介されていますが、この場合もplt.pauseが必要でした。
メインのウインドウからグラフ制御することを考えたいので何か新しいコマンドが発行されるまではずっと前の状態を保って表示を続け、コマンドが来れば対応する・・と言った動作をさせたい。
と思ったら、Qiitaに@Gyutan様の記事がありました。
制御用画面
記事を参考にまず、操作ボタン2つ用意して、一つはグラフ表示、一つはグラフ閉じる操作にします。
import matplotlib.pyplot as plt
import TkEasyGUI as eg
def make_main():
font_bt =('Arial',20)
main_layout=[
[eg.Text("操作画面",size=(20,1),font =font_bt)],
[eg.Button("bt1",font =font_bt),
eg.Button("bt2",font =font_bt),],
]
return eg.Window("グラフ変更テスト", main_layout, finalize=True)
window = make_main()
ax = [1, 2, 3, 4, 5]
ay = [0, 0, 0, 0, 8]
plotlabels = ['レベル0', 'レベル1', 'レベル2', 'レベル3', '合計']
def draw_plot():
plt.title("学習進捗", fontname="MS Gothic")
plt.bar(ax, ay, width=0.5, linewidth=1, tick_label=plotlabels)
plt.rcParams["font.sans-serif"]="MS Gothic"
plt.show(block=False)
while True:
event, values = window.read()
if event == eg.WIN_CLOSED or event == "Exit":
break
elif event == "bt1":
draw_plot()
elif event == "bt2":
plt.close()
window.close()
これ実行してみると、
![](https://assets.st-note.com/img/1713765168058-1c5lTfphjH.png)
ボタン1クリックで、グラフが表示され
![](https://assets.st-note.com/img/1713765214705-EZuFvboT0F.png?width=800)
ボタン2をクリックするとグラフが閉じるようになりました。ほぼ、期待通りの動作です。
但し、まだ理解できていないのですが、
・なぜ、この場合はplt.pause()を置かなくてもずっとグラフ表示が継続されるのだろう?
・グラフ表示をさせると、その後、メインのコントロールの画面から、アプリケーションアイコンと、タイトルが失われて、小さくなってしまうのはなぜ?
![](https://assets.st-note.com/img/1713765168058-1c5lTfphjH.png)
これが、
![](https://assets.st-note.com/img/1713765505206-TbfM5MW6kn.png)
こうなってしまうのは何故? ちなみに、PySimpleGUIでやっても
![](https://assets.st-note.com/img/1713766952617-goRjR7PZYG.png)
これがグラフ表示後には
![](https://assets.st-note.com/img/1713766981842-4zJ6sjmSPc.png)
こんなになってしましました・・・。
すっきりしないのですが、まあ、動けばいいか・・(イケナイパターン)。
Qiitaに@Gyutan様の別記事もありました。
この記事の
>(1) 別Windowで表示する方法
が、同じシチュエーションなので、実行例のコードを試しました。
![](https://assets.st-note.com/img/1713769224712-wkJqxOOrhY.png)
これが、Displayをクリックするとグラフが表示され
![](https://assets.st-note.com/img/1713769261927-C7rElRxS43.png)
こうなってしまった。同じ問題が起こってしまうようです。
この記事が気に入ったらサポートをしてみませんか?