19

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()
4

1 に答える 1

23

他のウィジェットがないため、他のウィジェットが必要な場所を見つけるのは困難です。これが私があなたに言うことができることです:そうすることによって、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

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

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

ちなみに、私は通常、ウィジェットを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倍拡張することを意味します。

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

于 2010-11-02T12:05:16.743 に答える