web-dev-qa-db-ja.com

PythonのTkinterメインウィンドウにプロットを配置する

データを処理して結果をプロットするプログラムがあります。通常Pythonプロットは新しいウィンドウに表示されますが、同じTkinterウィンドウにプロットを表示したいのです。これらの2つの答えを検索して見つけました Python Tkinter Embed GUIのMatplotlib 、および Tkinterウィンドウでmatplotlibプロットを更新するにはどうすればよいですか? 彼らは、まずキャンバスを作成してからグリッドまたはパックを使用してウィンドウに配置する必要があると述べています。これは私が初めてキャンバスを使用するとき、私はコンセプトを適用しました、そしてこれはそのための実用的なサンプルコードです、

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

__author__ = 'Dania'
import numpy as np
from Tkinter import *
import matplotlib.pyplot as plt
class mclass:
    def __init__(self,  window):
        self.box = Entry(window)
        self.button = Button (window, text="check", command=self.plot)
        self.box.pack ()
        self.button.pack()

    def plot (self):
        x=np.array ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
        v= np.array ([16,16.31925,17.6394,16.003,17.2861,17.3131,19.1259,18.9694,22.0003,22.81226])
        p= np.array ([16.23697,     17.31653,     17.22094,     17.68631,     17.73641 ,    18.6368,
            19.32125,     19.31756 ,    21.20247  ,   22.41444   ,  22.11718  ,   22.12453])

        plt.scatter(v,x,color='red')
        plt.plot(p, range(2 +max(x)),color='blue')
        plt.gca().invert_yaxis()

        plt.suptitle ("Estimation Grid", fontsize=16)
        plt.ylabel("Y", fontsize=14)
        plt.xlabel("X", fontsize=14)
        plt.show()
        plt.gcf().canvas.draw()
        fig = plt.figure()
        canvas = FigureCanvasTkAgg(fig, master=window)
        canvas.get_tk_widget().grid(row=1,column=24)
        canvas.draw()

window= Tk()
start= mclass (window)
window.mainloop()

上記のコードは、最初に別のウィンドウにプロットを表示し、次にグリッドで指定された位置にプロットのない灰色のキャンバスを表示します。また、キャンバスが垂直方向に拡大し、ウィンドウの一部が消えます。つまり、キャンバスが下のコンテンツを押し下げ、垂直スクロールバーが表示されなくなるため、キャンバスは表示されなくなります。

同じTkinterウィンドウにプロットを表示したいのですが、コンテンツが押し下げられた場合、ウィンドウをスクロールできるようにしたいと思います。

編集:実用的なサンプルコードが質問に追加されました。

誰が私が犯した間違い、そして問題を解決する方法を教えてもらえますか?

どんな助けでもありがたいです。

ありがとうございました。

7
Dania

主な変更:

  1. Matplotlib.pyplotの代わりにmatplolib.figureを使用(および関連するすべての関数の名前を変更)
  2. Self.window変数を追加する
  3. どこでもpack()を使用する(グリッドとパックを1つのコンテナーに混在させることはできません。)

結果:

__author__ = 'Dania'
import matplotlib
matplotlib.use('TkAgg')
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from Tkinter import *

class mclass:
    def __init__(self,  window):
        self.window = window
        self.box = Entry(window)
        self.button = Button (window, text="check", command=self.plot)
        self.box.pack ()
        self.button.pack()

    def plot (self):
        x=np.array ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
        v= np.array ([16,16.31925,17.6394,16.003,17.2861,17.3131,19.1259,18.9694,22.0003,22.81226])
        p= np.array ([16.23697,     17.31653,     17.22094,     17.68631,     17.73641 ,    18.6368,
            19.32125,     19.31756 ,    21.20247  ,   22.41444   ,  22.11718  ,   22.12453])

        fig = Figure(figsize=(6,6))
        a = fig.add_subplot(111)
        a.scatter(v,x,color='red')
        a.plot(p, range(2 +max(x)),color='blue')
        a.invert_yaxis()

        a.set_title ("Estimation Grid", fontsize=16)
        a.set_ylabel("Y", fontsize=14)
        a.set_xlabel("X", fontsize=14)

        canvas = FigureCanvasTkAgg(fig, master=self.window)
        canvas.get_tk_widget().pack()
        canvas.draw()

window= Tk()
start= mclass (window)
window.mainloop()
20
Eric Levieil

@アーロン、fig.clf()を使用して図をクリアできます。参照してください Figure.clf()

0
ugmurthy