Python Tkinter嵌入Matplotlib到GUI中

19

我正在尝试在用Python编写的Tkinter GUI中嵌入一个图表。我相信下面的代码成功地将一个图形放入画布中,但我无法控制画布在GUI网格中的位置。我希望能够将我的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()

2
顺便说一句,你的帖子对我非常有帮助,让我学会了如何应用matplotlib.figure.Figure来使我的程序工作。谢谢。 - deadstump
1个回答

23

由于您没有其他小部件,因此很难知道您想要其他小部件的位置。以下是我能告诉您的:通过执行dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1),您正在要求Tkinter填充屏幕以显示图表。这是因为你要求它在所有方向上填充(fill=BOTH)并扩展以填充任何额外的空间(expand=1)。

但是,您仍然可以添加其他小部件。 pack 函数将小部件放置在容器的一侧。您的容器master始终有四个边。例如,如果您想创建一个工具栏,则应执行以下操作:

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
请注意,如果您将此代码放在打包绘图的代码之后,则工具栏会显示在底部!这是因为TOPBOTTOM等是指已经被打包(pack)的任何其他小部件留下的空间。绘图占用顶部,剩余的空间在底部。因此,当您再次指定TOP时,它的意思是“位于已经在顶部的任何东西下面的区域的顶部”。
所以,您有一些选择。最好的选择是按照您希望它们出现的顺序创建小部件。如果在打包绘图之前将工具栏打包到顶部,它将是显示在顶部的工具栏。此外,您还可以将绘图放在底部而不是顶部,这也可以解决问题。
顺便说一句,我通常在一个块中创建我的小部件,然后在另一个块中布置它们。我发现这使得代码更易于维护。
另一个可能适合您的思维模型的选择是使用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)

请注意,行和列从零开始。此外,“weight”是指此小部件相对于其他小部件的扩展程度。如果有两行具有相等的权重,则它们在调整窗口大小时会以相等的方式扩展。权重为零表示不进行扩展。一个行的权重为2,另一个行的权重为1意味着前者将比后者扩展多一倍。

欲了解更多信息,请参见此页面(关于网格)此页面(关于包装)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接