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

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

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

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

Python

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

Q&A

解決済

2回答

2063閲覧

Python3.8.2でmatplotlib.pyplot.subplots()を実行するとウィンドウを消しても制御が返ってこない

kagaribisou

総合スコア17

Matplotlib

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

Python

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

0グッド

0クリップ

投稿2020/05/15 10:44

前提

python 3.8.3
tkinter 8.6
matplotlib 3.2
windows 10 Home

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

pythonのスクリプトをコマンドプロンプトで実行し、終了した後にコマンドプロンプトに入力できなくなることが起きました。

該当のソースコード

Python

1from tkinter import Tk 2from matplotlib.pyplot import subplots 3 4root = Tk() 5subplots() 6root.mainloop() 7

試したこと

Pythonの再インストール
matplotlibの再インストール

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

plt.close() で matplotlib を終了してください。
そうすれば、直ると思います。

python

1from tkinter import Tk 2import matplotlib.pyplot as plt 3 4root = Tk() 5plt.subplots() 6plt.close() 7root.mainloop()

追記

plt.figure()、plt.subplots() といった関数は matplotlib 内で tkinter のウィンドウを作ってしまうので、それで衝突している可能性があります。
matplotlib で作りたいのは、グラフが描画されたキャンバスであるならば、以下のようにします。

  1. matplotlib.figure.Figure() で Figure を作成する。
  2. Figure.add_subplot(111) で Figure に Axes を追加する。

こうすれば、matplotlib 内部でウィンドウが作られることはないはずです。

python

1from matplotlib.lines import Line2D 2from matplotlib.figure import Figure 3from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 4from tkinter import Tk 5 6root = Tk() 7 8fig = Figure() 9ax = fig.add_subplot(111) 10 11canvas = FigureCanvasTkAgg(fig, master=root) 12canvas.get_tk_widget().pack(fill='both', expand=True) 13 14line = Line2D([0, 1], [0, 1]) 15 16ax.add_line(line) 17canvas.draw() 18 19root.mainloop()

投稿2020/05/15 11:16

編集2020/05/15 14:19
tiitoi

総合スコア21956

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

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

kagaribisou

2020/05/15 12:40

tiitoiさん回答ありがとうございます。 ご指摘の通りにコードを追加したら制御が戻ってきました。 重ね重ね申し訳ないのですが、この現象で Ctrl + c による、KeyboardInterruptを受け付けなかった原因は見当がつくでしょうか。もしよろしければご教授お願いいたします。 また、ソースを見たところpyplot.close()は内部のヘルパークラスを呼び出しているようで、そこでFigureを破壊している処理に見えました。 なので、この現象の原因はrootはウィンドウのボタンにより破壊されたが、Figureを破壊する処理が走らなかったことが原因であると思いましたが、そのような解釈でよろしいでしょうか。
tiitoi

2020/05/15 12:53 編集

matplotlib の tkinter のウィンドウと質問者さんが `root = Tk()` 作った tkinter のウィンドウの2つある状態になっていて、ウィンドウを閉じて終了したのは質問者さんが作った tkinter のウィンドウの方で、matplotlib のウィンドウは残ったままなので、それで処理が返らない状態になっていたのではないでしょうか。 matplotlib を tkinter で表示する場合、それとは別に自分で `root = Tk()` でウィンドウを作るという使い方は想定されていないと思います。
kagaribisou

2020/05/15 13:42

丁寧なご返信ありがとうございます。 申し訳ないです。質問するときにコードを簡略化する上で省いてはいけない部分を省いてしまったのですが、以下のコードも同様に処理が返ってきていません。この場合ウィンドウが同一のものになっていると思うのですが、これは、tkinterとmatplotlibのバージョンが合わずFigureCanvasTkAggが動作していないのでしょうか。 ```Python from matplotlib.pyplot import (subplots) from matplotlib.lines import Line2D from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from tkinter import Tk root = Tk() fig, ax = subplots() canvas = FigureCanvasTkAgg(fig, master=root) canvas.get_tk_widget().pack(fill='both', expand=True) line = Line2D([0, 1], [0, 1]) ax.add_line(line) canvas.draw() root.mainloop() ```
tiitoi

2020/05/15 14:20

追記したようにすれば、canvas だけ作成できます。
kagaribisou

2020/05/17 00:22

plt.subplot()の関数はtkinterのウィンドウを作るとは知りませんでした。 解決方法だけではなく原因もわかりスッキリしました。 ありがとうございます。
guest

0

matplotlibの公式サイトでTkinter (>= 8.3, != 8.6.0 or 8.6.1)との記載がありましたのでこれが原因であると思われます。

投稿2020/05/15 10:47

kagaribisou

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問