web-dev-qa-db-ja.com

Python Tkinter Embed Matplotlib in GUI

PythonでコーディングされたTkinterGUIにプロットを埋め込もうとしています。以下のコードは、グラフをキャンバスに配置するだけで成功すると思いますが、GUIグリッド内のキャンバスの位置を制御することはできません。 GUIのサブセクションをプロットにしたいと思っています...全体ではありません。このキャンバスウィジェットを配置するにはどうすればよいですか?

#!/usr/apps/Python/bin/python
import matplotlib, sys
matplotlib.use('TkAgg')
from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from Tkinter import *

master = Tk()
master.title("Hello World!")
#-------------------------------------------------------------------------------

f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)
t = arange(0.0,3.0,0.01)
s = sin(2*pi*t)
a.plot(t,s)


dataPlot = FigureCanvasTkAgg(f, master=master)
dataPlot.show()
dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
#-------------------------------------------------------------------------------
master.mainloop()
19
thenickname

他のウィジェットがないため、他のウィジェットが必要な場所を見つけるのは困難です。ただし、これが私が言えることです。dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)を実行すると、Tkinterに画面をプロットで埋めるように要求します。これは、すべての方向に入力するように要求するためです(fill=BOTH)そして拡張して余分なスペースを埋めます(expand=1)。

ただし、他のウィジェットを追加することはできます。 packは、コンテナの片側にウィジェットを配置することで機能します。コンテナmasterには、常に4つの側面があります。したがって、たとえば、ツールバーを作成する場合は、次のようにします。

toolbar = tk.Frame(master)
button = tk.Button(toolbar, text="Push me")
button.pack(side="left") # left side of parent, the toolbar frame
toolbar.pack(side=TOP, fill="x") # top of parent, the master window

このコードをafterプロットをpackするコードに置くと、ツールバーが下部に表示されることに注意してください。これは、TOPBOTTOMなどが、すでにpackされている他のウィジェットによって残されたスペースを参照しているためです。プロットが上になり、残ったスペースが下になります。したがって、TOPを再度指定すると、「すでに上部にあるものはすべて、下の領域の上部にある」という意味になります。

だから、あなたはいくつかの選択肢があります。最良の選択は、ウィジェットを表示したい順序で作成することです。プロットをpackする前に上部のツールバーをpackすると、最上部に表示されるのはツールバーになります。さらに、プロットを上ではなく下に配置することもでき、それによって問題も解決されます。

ちなみに、私は通常、ウィジェットを1つのブロックに作成し、それらをすべて別のブロックに配置します。コードの保守が簡単になると思います。

メンタルモデルにより適したもう1つの選択肢は、grid代わりにpackです。 gridを使用すると、ウィジェットが占める行と列を選択できます。これにより、グリッドに物事を簡単にレイアウトできますが、もう少しコードを使用する必要があります。

たとえば、ツールバーを上部に配置し、プロットを下部に配置するには、次のようにします。

toolbar.grid(row=1, column=1, sticky="ew")
dataPlot.get_tk_widget().grid(row=1, column=1, sticky="nsew")
master.grid_rowconfigure(0, weight=0)
master.grid_rowconfigure(1, weight=1)
master.grid_columnconfigure(0, weight=1)

行と列がゼロから始まることに注意してください。また、「重み」は、このウィジェットが他のウィジェットと比較してどれだけ拡張するかを示します。重みが等しい2つの行では、ウィンドウのサイズが変更されたときに均等に拡張されます。重みがゼロの場合、拡張はありません。 1つの行の重みが2で、別の行の重みが1の場合、前者は後者の2倍に拡張されます。

詳細については、 グリッド上のこのページ および パック上のこのページ を参照してください。

23
Bryan Oakley