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

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

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

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Tkinter

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

Python

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

Q&A

解決済

2回答

3752閲覧

Tkinterにmatplotlibを表示させる

5555maru

総合スコア1

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/07/30 07:54

編集2021/08/01 16:43

前提・実現したいこと

数値を入力しグラフを同じウィンドウ内に表示させる下の図のようなGUIをtkinterを用いて作りたい
また,数値を再度入力するとグラフを更新し,グラフを名前をつけて保存したい.

イメージ説明

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

ウィンドウ内にmatplotlibにて作成したグラフを埋め込めない

該当のソースコード

python

1 2 3 4 5import numpy as np 6import matplotlib.pyplot as plt 7from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk) 8import tkinter as tk 9import tkinter.ttk as ttk 10from matplotlib.figure import Figure 11from matplotlib.backend_bases import key_press_handler 12 13 14 15 16root = tk.Tk() 17root.title("tkinter application") 18root.geometry("1000x600") 19 20lbl_1 = ttk.Label(root,text="tの値") 21lbl_1.place(x=30, y=10) 22txt = tk.Entry(root,width=20) 23txt.place(x=90, y=10) 24 25btn_1 = ttk.Button(root, text="OK") 26btn_1.place(x=100, y=40) 27def btn_1_click(): 28 29 l = float (txt.get()) 30 print (l) 31 32 x = np.arange(0, 1, 0.001) 33 y1 = np.sin(l*x) 34 y2 = np.cos(l*x) 35 36 fig1 = Figure(figsize=(5, 4), dpi=100) 37 fig2 = Figure(figsize=(5, 4), dpi=100) 38 39 fig1.add_subplot().plot(x, y1) 40 fig2.add_subplot().plot(x, y2) 41 42 43 canvas1 = FigureCanvasTkAgg(fig1, master=root) 44 canvas2 = FigureCanvasTkAgg(fig2, master=root)# A tk.DrawingArea. 45 canvas1.draw() 46 canvas2.draw() 47 toolbar1 = NavigationToolbar2Tk(canvas1, root, pack_toolbar=False) 48 toolbar1.update() 49 toolbar2 = NavigationToolbar2Tk(canvas2, root, pack_toolbar=False) 50 toolbar2.update() 51 52 canvas1.mpl_connect( 53 "key_press_event", lambda event: print(f"you pressed {event.key}")) 54 canvas1.mpl_connect("key_press_event", key_press_handler) 55 56 canvas1.mpl_connect( 57 "key_press_event", lambda event: print(f"you pressed {event.key}")) 58 canvas1.mpl_connect("key_press_event", key_press_handler) 59 60button = tk.Button(master=root, text="Quit", command=root.quit) 61btn_1["command"] = btn_1_click 62 63 64root.mainloop()
### 試したこと FigureCanvasTkAggにて作成を試みたができなかった ### 補足情報(FW/ツールのバージョンなど) Python 初心者ですがよろしくお願い致します.

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

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

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

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

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

guest

回答2

0

ベストアンサー

複数の問題があります。

def btn_1_click(): ... 略 plt.show() # 問題点2: イベントループの競合 # グラフのウィンドウが表示されている間、ここは実行されない # ⇒ 条件次第ですが、バックエンドが tkinter ではない場合は、 # グラフのウィンドウを閉じるまでtkinter のイベントが稼働しない。 # 解決策: 埋め込むなら FigureCanvasTkAgg を使う。 # 問題点1: btn_1_clickを呼び出すボタンのイベントが登録されていない。 root.mainloop()

FigureCanvasTkAggにて作成を試みたができなかった

質問を編集して、試してみて出来なかったコードを掲載出来ますか。

目的の挙動が「同じウィンドウ内への埋め込み」の場合は、
FigureCanvasTkAgg を用いた実装が正解です。

埋め込みに拘らない・別ウィンドウでも構わない場合は、他の実装手段もあります。


plt.show() と root.mainloop() の併用は、
pyplot のバックエンド次第では tkinter 部分が応答なしになる事があります。

バックエンドが tkinter の場合は、tkinter のイベントも稼働しますが、
イベントループが入れ子になってしまい、
意図しない挙動を引きを超す可能性がある為、お勧めはしません。

埋め込みの場合は、

  • tkinter のウィンドウ内に matplotlib のグラフを埋め込み
  • matplotlib のグラフ内に、tkinter のウィジェットを埋め込み

の2通りありますが、通常は plt.show は使わずに
前者のFigureCanvasTkAggを使う方法を取ります。

  • Embedding in Tk 公式ドキュメントより、tkinter に埋め込むデモ

投稿2021/07/30 11:15

teamikl

総合スコア8760

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

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

5555maru

2021/08/01 16:40

返信が遅くなり,申し訳ございません. tkinter のウィンドウ内に matplotlib のグラフを埋め込みをしたいと思っております. 教えていただいた公式ドキュメントを参考に一度書き直してみました. しかし「ok」ボタンを押したのち,グラフを表示させることができませんでした.
teamikl

2021/08/01 23:41

matplotlib 単体で使う場合と、埋め込みで使う場合のコードが混在してそうです。 >しかし「ok」ボタンを押したのち,グラフを表示させることができませんでした. tkinter への配置、サンプルコードで言う pack() に相当する箇所がありません。
teamikl

2021/08/01 23:51 編集

また、ボタンクリック時に FigureCanvasTkAgg を毎回作成するのは、 依然としてメモリリークになる為、解消するにはどちらかの方法を取ってください。 A: 予め FigureCnavasTkAgg は作成しておき、クリック時にはデータのみ更新する。 B: 以前の FigureCnavaTkAgg を破棄してから、新しい FigureCanvasTkAgg を作成する。
5555maru

2021/08/11 09:00

ありがとうございます! 動作することができました.
guest

0

btn_1_clickメソッドが呼び出されていないだけだと思います。
root.mainloop()の直前に下記コードを追加して下さい。

python

1btn_1["command"] = btn_1_click 2

すると画像のようなグラフが出てきました。
イメージ説明

投稿2021/07/30 08:32

odataiki

総合スコア973

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

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

5555maru

2021/08/01 16:46

返信が遅くなり,申し訳ございません. btn_1["command"] = btn_1_click により入力された数値を計算式に入力することができました! この後に,tkinter上にもこのグラフを埋め込むような動作をさせたいです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問