3

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

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

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

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

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

4

1 回答 1

5

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 截图

于 2013-12-05T09:10:33.357 回答