Python Tkinter在GUI中嵌入Matplotlib

Python Tkinter在GUI中嵌入Matplotlib,python,matplotlib,grid,tkinter-canvas,Python,Matplotlib,Grid,Tkinter Canvas,我试图在我的Tkinter GUI中嵌入一个用Python编写的绘图。我相信下面的代码可以简单地将图形放入画布,但我无法控制GUI网格中的画布位置。我希望我的图形用户界面有一个部分是情节,而不是全部。如何定位此画布小部件 #!/usr/apps/Python/bin/python import matplotlib, sys matplotlib.use('TkAgg') from numpy import arange, sin, pi from matplotlib.backends.bac

我试图在我的Tkinter GUI中嵌入一个用Python编写的绘图。我相信下面的代码可以简单地将图形放入画布,但我无法控制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()

您没有任何其他小部件,因此很难知道在哪里需要其他小部件。下面是我可以告诉您的:通过执行
dataPlot.get\tk\u 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
请注意,如果将此代码放在
pack
绘图的代码之后,工具栏将显示在底部!这是因为
TOP
BOTTOM
等指的是任何其他小部件已经
pack
编辑过的剩余空间。绘图占据顶部,剩余空间位于底部。因此,当您再次指定
TOP
时,它的意思是“在下面区域的顶部,已经在顶部的内容”

所以,你有一些选择。最好的选择是按照您希望的顺序制作小部件。如果在
pack
绘图之前先将工具栏
pack
放在顶部,则工具栏将显示在最顶部。此外,您可以将绘图放置在底部而不是顶部,这也将解决问题

顺便说一下,我通常在一个块中创建我的小部件,然后将它们全部放在一个单独的块中。我发现它使代码更易于维护

另一个可能更适合你的心智模型的选择是
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意味着前者的膨胀率是后者的两倍


有关更多信息,请参阅和

在学习如何应用
matplotlib.figure.figure
的过程中,您的帖子对我非常有帮助。谢谢