如何在Python Tkinter GUI中嵌入Cartopy?

如何在Python Tkinter GUI中嵌入Cartopy?,python,matplotlib,tkinter,embed,cartopy,Python,Matplotlib,Tkinter,Embed,Cartopy,我想在Python(2.7)Tkinter GUI应用程序(在Windows7 PC上)中嵌入一个Cartopy模块映射,但我需要了解如何嵌入 据我所知,Cartopy模块只允许matplotlib将其“绘图”或图形视为坐标,并将其投影到真实世界的地理投影。现在我看到了关于如何将matplotlib嵌入Tkinter的问题和指南,但这些问题和指南总是涉及到创建matplotlib Figure(),然后在该图上使用show()方法和FigureCastKagg(),而创建cartopy贴图的说明

我想在Python(2.7)Tkinter GUI应用程序(在Windows7 PC上)中嵌入一个Cartopy模块映射,但我需要了解如何嵌入

据我所知,Cartopy模块只允许matplotlib将其“绘图”或图形视为坐标,并将其投影到真实世界的地理投影。现在我看到了关于如何将matplotlib嵌入Tkinter的问题和指南,但这些问题和指南总是涉及到创建matplotlib Figure(),然后在该图上使用show()方法和FigureCastKagg(),而创建cartopy贴图的说明通常只是使用pyplot的轴()方法,然后将show()与pyplot模块(而不是Figure对象)一起使用。我尝试了一些不同的方法,但我无法理解如何协调这两种方法(创建cartopy matplotlib和在Tkinter中嵌入matplotlib)。我有制图、Python和Tkinter方面的经验,但我不熟悉matplotlib和cartopy,所以可能是因为我对这些模块还不够了解

如果有人能在给出答案的同时给出一个具体的代码示例,那将是非常有帮助的。如果能看到一个示例,说明如何在新嵌入的cartopy贴图中绘制线或点,例如,我应该在哪个对象上使用.plot()方法,那将非常好

从长远来看,希望能够通过Tkinter GUI应用程序与cartopy地图交互。顺便说一句,以前有没有人做过这样的卡通Tkinter嵌入


-->答案:感谢@Pelson提供的答案和代码示例。对于其他有同样问题的人,我理解的关键步骤是1)创建matplot图形,2)通过包含投影参数(从而使其成为Cartopy轴)向图形添加轴,以及3)通过使用图形上的FigureCanvasTkAgg函数,然后使用其show()和gettk_widget()将图形转换为Tkinter小部件方法在Tkinter窗口中打包或放置小部件

Cartopy和pyplot没有什么特别之处-一切都将与matplotlib的OO接口一起工作。这意味着在任何GUI工具包中嵌入Cartopy轴与嵌入matplotlib轴一样困难

在本例中,我以中的示例为例,简单地添加了以下几行:

# Use add_axes or add_subplot.
ax = fig.add_axes([0.01, 0.01, 0.98, 0.98],
                   projection=ccrs.InterruptedGoodeHomolosine())

# ax = fig.add_subplot(1, 1, 1, projection=ccrs.InterruptedGoodeHomolosine())

ax.set_global()
ax.stock_img()
ax.coastlines()
我的完整应用程序如下所示:

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure

import cartopy.crs as ccrs

import sys
import Tkinter as Tk

root = Tk.Tk()
root.wm_title("Cartopy in TK")


fig = Figure(figsize=(8,4), dpi=100)

ax = fig.add_axes([0.01, 0.01, 0.98, 0.98], 
                   projection=ccrs.InterruptedGoodeHomolosine())
ax.set_global()
ax.stock_img()
ax.coastlines()

ax.set_title('Cartopy and Tkinter')

# a tk.DrawingArea
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.show()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

button = Tk.Button(master=root, text='Quit', command=sys.exit)
button.pack(side=Tk.BOTTOM)

Tk.mainloop()
要生成如下所示的Tkinter GUI应用程序:
pyplot
是一个模块而不是一个对象。下面的方法是相同的,只是上面有更多方便的包装。