FC2ブログ

PySimpleGUI 学習:FigureCanvasTkAgg の利用 - 本番

2021-03-24 :  PCクリニック
前回(2021-03-17)の記事:
PySimpleGUI 学習:FigureCanvasTkAgg の利用
で、

  from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

について、更なる学習を行った。

だが、
未だ、Tkinter から使う場合だった。

それで、記事の最後に、

  「PySimpleGUI matplotlib FigureCanvasTkAgg
  と検索して、

  そのものずばり、
  “Qiita”の記事:「PySimpleGUIにMatplotlibを埋め込みたい
  が見つかった。

  これで、更なる学習だ。

と書いて終わっていた。


今回の記事は、その後の学習結果(?)について。



当該記事にある、プログラム
##### embedded-matplotlib.py
import numpy as np
import PySimpleGUI as sg
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

# GUIがぼやける現象を防ぐための関数
def make_dpi_aware():
import ctypes
import platform
if int(platform.release()) >= 8:
ctypes.windll.shcore.SetProcessDpiAwareness(True)
make_dpi_aware()

# 描画用の関数
def draw_figure(canvas, figure):
figure_canvas_agg = FigureCanvasTkAgg(figure, canvas)
figure_canvas_agg.draw()
figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1)
return figure_canvas_agg

# レイアウト作成
layout = [[sg.Text('Embed Matplotlib Plot')],
[sg.Canvas(key='-CANVAS-')],
[sg.Button("Add"), sg.Button("Clear")]]

# windowを作成する.finalize=Trueにする必要がある.
window = sg.Window('Demo App', layout, finalize=True, font='Monospace 18')

# 埋め込む用のfigを作成する.
fig = plt.figure(figsize=(5, 4))
ax = fig.add_subplot(111)
ax.set_ylim(-10, 10)

# figとCanvasを関連付ける.
fig_agg = draw_figure(window['-CANVAS-'].TKCanvas, fig)

# イベントループ
while True:
event, values = window.read()
print(event, values)
# sg.Print(event, values)

if event in (None, "Cancel"):
break

elif event == "Add":
# 適当なプロット用データ作成
t = np.linspace(0, 7, 100)
afreq = np.random.randint(1, 10)
amp = np.random.randint(1, 10)
y = amp * np.sin(afreq * t)

# プロット
ax.plot(t, y, alpha=0.4)

# 変更を加えたあと,fig_agg.draw()で変更を反映させる.
fig_agg.draw()

elif event == "Clear":
ax.cla()
fig_agg.draw()

# ウィンドウを閉じる.
window.close()
と、以降の解説
で学習。


結果をまとめて、<紙>流コードに:
# -*- coding: utf-8 -*-              # 文字コード:UTF-8

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg #####
# ------------------------------------------
import PySimpleGUI27 as sg # Python 2.7 版

# ====================
def DISP():
fig = plt.Figure() # Figureインスタンスを生成

ax2 = fig.add_subplot(121) # Axesを作る。
ax2.set_xlabel( '~~~' )
ax2.set_ylabel( '~~~' )
ax2.set_xlim( x0, x1 )
ax2.set_ylim( y0, y1 )
ax2.set_title( '~~~' )
ax2.plot( X, Y, 'b-' ) # データをプロット

####### その他、等々・・・

figure_canvas_agg = FigureCanvasTkAgg(fig, window['-CANVAS-'].TKCanvas)
figure_canvas_agg.draw()
figure_canvas_agg.get_tk_widget().grid(row=0, column=1)


# =============================================

####### ファイル入力処理

####### x0、x1、y0、y1、X[]、y[] 設定処理

# =============================================
# 関数とkeyをセットにして辞書にする
handler = { '-DISP-' : DISP,
####### 等々,
]

layout = [
[sg.Text(' タイトル', font=('Helvetica',18))],
[sg.Text(' ')],
[sg.Text(' '), sg.Button('Display Graph', key='-DISP-')],

[sg.Canvas(key='-CANVAS-')] ] #####

window = sg.Window('Title', layout=layout, finalize=True, size=(700,900) )

while True:
event, value = window.read()
if event is None:
break

function = handler[event] # handlerからeventに応じた関数を呼び出す
function()

window.close() # 終了処理
でしょうか?


これで、“QT_PLUGIN_PATH”を設定しなくても動いた。

めでたし。メデタシ。



本日はここまで。


PySimpleGUI の学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

201226
関連記事
スポンサーサイト



コメントの投稿

管理者にだけ表示を許可する

人気blog Ranking



最新記事
カレンダー
07 | 2021/08 | 09
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

FC2 / i2i / Google




Google Analytics
ブックマーク