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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Q&A

解決済

1回答

5081閲覧

tkinterのGUIにmatplotの画像表示していますが、別ウインドウでヒストグラムを表示したい。

dendendenjirou

総合スコア40

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

0グッド

0クリップ

投稿2020/11/03 03:02

tkinterのGUI上に画像を表示し、ボタンを押すことで別ウインドウでヒストグラムを表示したいと考えています。
コードは以下となります。

python

1# -- coding utf-8 -- 2import tkinter as tk 3from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 4import numpy as np 5import matplotlib.pyplot as plt 6from PIL import Image 7 8 9def histgram(): 10 global img 11 fig_hist1 = plt.figure() 12 ax_hist1 = fig_hist1.add_subplot(111) 13 ax_hist1.hist(img.flatten(), bins=np.arange(256 + 1)) 14 plt.show() 15 16 17def main(): 18 global img 19 20 root = tk.Tk() 21 root.geometry("700x500") 22 root.title("test") 23 fig=plt.figure(figsize=(5, 5)) 24 25 ax = fig.add_subplot(111) 26 img = np.array(Image.open("111.png")) 27 ax.imshow(img) 28 29 Canvas = FigureCanvasTkAgg(fig, master=root) 30 Canvas.get_tk_widget().grid(row=0, column=3, rowspan=10) 31 32 ButtonWidth = 15 33 ImgButton1 = tk.Button(text="ヒストグラム", width=ButtonWidth, command=histgram) 34 ImgButton1.grid(row=1, column=0, columnspan=2) 35 36 root.mainloop() 37 38if __name__ == "__main__": 39 main()

しかし、以下のエラーが出ています。

python

1AttributeError: 'FigureCanvasTkAgg' object has no attribute 'manager' 2Figure.show works only for figures managed by pyplot, normally created by pyplot.figure().

もし、どなたか解決方法をご存知の方がいらっしゃいましたらご教授いただけると助かります。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

anaconda/python3.7.9/matplotlib3.3.1/win10/64bit で問題のエラーは再現できませんでしたが、

Tkinter を併用する場合は、plt.show は使わず、
tk.Toplevel で別ウィンドウを作り、その上に FigureCanvasTkAgg で
main()内で行っているように figure を配置します。

最低限の修正。私の環境ではボタンを押すとウィンドウが2つ(元を合わせて合計3つ)現れてました。

python

1def histgram(): 2 # 省略 3 4 # plt.show() 5 6 window = tk.Toplevel() 7 canvas = FigureCanvasTkAgg(fig_hist1, master=window) 8 canvas.get_tk_widget().pack()

エラー自体は再現できてないので、該当するエラーの問題解消にはならない可能性はあります。

Github matplotlib で同様の報告: 複数のbackend (qt+tk) が混在して起こっているようです。

投稿2020/11/03 07:39

編集2020/11/03 07:52
teamikl

総合スコア8664

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

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

dendendenjirou

2020/11/03 08:39

teamikl様 ご回答ありがとうございました。 無事解決できました。本当にありがとうございます。 エラーから、新規のfigの設定が必要と考えたのですが その際、tkinterを使わずにグラフだけ表示できればと思い plt.show() を使っていました。それが原因だったんですね。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問