我想在Windows 7 PC上的Python(2.7)Tkinter GUI应用程序中嵌入Cartopy模块图,但是我需要帮助弄清楚如何做.
据我了解,Cartopy模块仅使matplotlib能够将其“图形”或图形视为坐标,并将其投影到现实世界的地理投影中.现在,我已经看到了有关如何将matplotlib嵌入到Tkinter中的问题和指南,但是这些问题和指南总是涉及创建matplotlib Figure(),然后在该图上使用show()方法和FigureCanvasTkAgg(),而创建Cartopy地图的说明通常是在提供一个Cartopy投影对象时简单地使用pyplot的axes()方法,然后将pyplot模块(而不是Figure对象)与show()一起使用.我已经尝试了一些不同的方法,但是我只是无法理解如何协调这两种方法(创建cartopy matplotlib并将matplotlib嵌入Tkinter).我有制图,Python和Tkinter的经验,但是我对matplotlib和cartopy还是陌生的,所以可能我只是对这些模块还不够了解.
如果有人可以提出一个具体的代码示例及其答案,那将非常有帮助.看到我如何在新的嵌入式Cartopy地图中绘制线或点的示例(例如,我在哪个对象上使用.plot()方法?
从长远来看,希望是能够通过Tkinter GUI应用程序与Cartopy Map进行交互.顺便说一句,以前有没有人做过类似Tkinter嵌入的Cartopy?
—>答:感谢@Pelson的回答,并提供了代码示例.对于其他遇到相同问题的人,我认为关键的步骤是:1)创建一个Matplot图形,2)通过包含投影参数(从而使其成为Cartopy轴)向图形添加轴,以及3)转换图形通过在其上使用FigureCanvasTkAgg函数,然后使用其show()和get_tk_widget()方法将其包装到Tkinter窗口中,可以将其添加到Tkinter窗口小部件.
解决方法:
Cartopy和pyplot没什么特别的-一切也可以与matplotlib的OO接口一起使用.这意味着将Cartopy轴嵌入与将matplotlib轴嵌入任何GUI工具包一样困难.
在这种情况下,我以http://matplotlib.org/examples/user_interfaces/embedding_in_tk2.html为例,仅添加了以下几行:
# 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应用程序: