如何在Python Tkinter GUI中嵌入Cartopy?

时间:2013-12-04 20:40:56

标签: python matplotlib tkinter embed cartopy

我想在Python(2.7)Tkinter GUI应用程序(在Windows 7 PC上)中嵌入一个Cartopy模块映射,但我需要帮助弄清楚如何。

据我了解,Cartopy模块只是使matplotlib能够将其“图”或图形视为坐标,并将这些图形投影到真实世界的地理投影中。现在我已经看到了关于如何将matplotlib嵌入到Tkinter中的问题和指南,但是这些总是涉及创建一个matplotlib图(),然后在该图上使用show()方法和FigureCanvasTkAgg(),而创建一个cartopy map的说明通常只需使用pyplot的axes()方法,同时提供一个cartopy投影对象,然后使用show()和pyplot模块(而不是Figure对象)。我尝试了一些不同的东西,但我无法理解如何调和这两种方法(创建一个cartopy matplotlib并在Tkinter中嵌入matplotlib)。我有制图,Python和Tkinter的经验,但我是matplotlib和cartopy的新手,所以我可能还不够理解这些模块。

如果有人可以提出具体的代码示例及其答案,那将是最有帮助的。看到如何在新的嵌入式纸盒地图中绘制线条或点,例如,例如,这也是很好的。我在哪个对象上使用.plot()方法?

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

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

1 个答案:

答案 0 :(得分:4)

Cartopy和pyplot没有什么特别之处 - 所有内容都适用于matplotlib的OO界面。这意味着嵌入Cartopy轴与在任何GUI工具包中嵌入matplotlib轴一样困难。

在这种情况下,我从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应用程序看起来像: Tkinter screenshot