🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Matplotlib

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

Tkinter

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

Python

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

Q&A

解決済

2回答

7411閲覧

python tkinterとmatplotlibの連携で画像更新の際にFigureが重なってしまう

tomo754

総合スコア11

Matplotlib

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/02/01 05:11

前提・実現したいこと

tkinterを使用してcanvas内に任意の画像のヒートマップを表示させています。
この時、開くボタンから別の画像を表示させると前回のデータが残っており、Figureが重なってしまいます。
一度、前回データを初期化し、重ならないように出来ないでしょうか。

該当のソースコード

#ライブラリを取り込む import tkinter as tk from tkinter import filedialog import cv2 from PIL import Image, ImageTk import os import numpy as np from matplotlib import pylab as plt from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk) # coding: utf-8 img = None #初期化 filepath = None #初期化 #メインウインドウを作成 win = tk.Tk() win.title("輝度ヒートマップ")#タイトル win.geometry("830x600")#サイズ #パーツを配置 #ラベル1を作成 label1 = tk.Label(text='■画像読込') label1.place(x=10, y=10) #ラベル2を作成 label2 = tk.Label(text='ファイル名:') label2.place(x=10, y=40) #ファイルパスの表示欄を作成 input_box1 = tk.Entry(width=75, bd=4) input_box1.place(x=80, y=40) #参照ボタンの動作 def file_select(): global filepath #グローバル宣言 #ファイルパスを表示欄に表示 idir = r'C:\descktop' filetype = [("すべて","*")] filepath = tk.filedialog.askopenfilename(filetypes = filetype, initialdir = idir) input_box1.delete(0, tk.END) input_box1.insert(0, filepath) #選択したファイルを表示 if filepath and os.path.isfile(filepath): #グレースケールに変換 #ヒートマップで表示 global img #グローバル宣言 img = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE) fig = plt.figure() plt.imshow(img,cmap="jet") plt.colorbar() #メインウィンドウにfig表示 canvas = FigureCanvasTkAgg(fig, master=win) toolbar = NavigationToolbar2Tk(canvas, win) canvas.get_tk_widget().place(x=20, y=100) #ボタン1を作成 button1 = tk.Button(text="開く", command=file_select, width=8, bd=4) button1.place(x=630, y=35) #GUIをそのまま表示 win.mainloop()

試したこと

canvas.deleteやfig.clf()等試しましたが上手く機能しませんでした。

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

OS:Windows8
Python3.6.1

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

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

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

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

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

guest

回答2

0

python

1#ライブラリを取り込む 2import tkinter as tk 3from tkinter import filedialog 4import cv2 5from PIL import Image, ImageTk 6import os 7import numpy as np 8from matplotlib import pylab as plt 9from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk) 10 11# coding: utf-8 12 13img = None #初期化 14filepath = None #初期化 15 16 17#メインウインドウを作成 18win = tk.Tk() 19win.title("輝度ヒートマップ")#タイトル 20win.geometry("830x600")#サイズ 21 22#パーツを配置 23#ラベル1を作成 24label1 = tk.Label(text='■画像読込') 25label1.place(x=10, y=10) 26 27#ラベル2を作成 28label2 = tk.Label(text='ファイル名:') 29label2.place(x=10, y=40) 30 31#ファイルパスの表示欄を作成 32input_box1 = tk.Entry(width=75, bd=4) 33input_box1.place(x=80, y=40) 34 35#figを格納するcanvasを作製 36fig = plt.figure() 37canvas = FigureCanvasTkAgg(fig, master=win) 38toolbar = NavigationToolbar2Tk(canvas, win) 39canvas.get_tk_widget().place(x=20, y=100) 40 41 42#参照ボタンの動作 43def file_select(): 44 45 global filepath #グローバル宣言 46 47 #ファイルパスを表示欄に表示 48 idir = r'C:\descktop' 49 filetype = [("すべて","*")] 50 filepath = tk.filedialog.askopenfilename(filetypes = filetype, initialdir = idir) 51 input_box1.delete(0, tk.END) 52 input_box1.insert(0, filepath) 53 54 55 #選択したファイルを表示 56 if filepath and os.path.isfile(filepath): 57 #グレースケールに変換 58 #ヒートマップで表示 59 global img #グローバル宣言 60 61 fig.clf()#先に表示されているfigを消す 62 img = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE) 63 plt.imshow(img,cmap="jet") 64 plt.colorbar()#カラーバー表示 65 canvas.draw()#メインウィンドウにfig表示 66 67#ボタン1を作成 68button1 = tk.Button(win, text="開く", command=file_select, width=8, bd=4) 69button1.place(x=630, y=35) 70 71#GUIをそのまま表示 72win.mainloop()

投稿2021/02/01 08:19

tomo754

総合スコア11

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

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

0

ベストアンサー

問題の原因は、ボタンを押される度に 毎回新しいFigureCanvasTkAgg を作っていて、
以前のものが残っている為です。その点に注意して試してみてください。

canvas.deleteやfig.clf()等試しました

解決策の方向としては正解です。恐らくどのように試したのか

  • 予め FigureCanvasTkAgg は用意しておき、(file_select()の外で作成しておく)

 ボタンクリック時は、描画データのみ更新する。描画更新は canvas.draw()

  • 毎回 FigureCanvasTkAgg を作成する場合、(file_select()の中で作成する場合)

 事前に、前に生成した残っているキャンバスを削除する。
tkinter のウィジェット破棄は canvas.get_tk_widget().destroy()


参考: Tkinterでグラフを描画して、ボタンをクリックする度にグラフを更新する
※ 一点だけ補足で、回答にあるコード canvas.show() → canvas.draw() 描画の更新のみ行う場合

投稿2021/02/01 06:10

teamikl

総合スコア8738

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

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

tomo754

2021/02/01 08:23

teamiklさん。 アドバイス有難う御座いました。 事前にCanvas作成する方法で解決できました。 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問