如何在Python Tkinter GUI中嵌入Cartopy?

3
我想在一个Python (2.7) Tkinter GUI应用程序(在Windows 7 PC上)中嵌入Cartopy模块地图,但我需要帮助弄清楚如何操作。
据我所知,Cartopy模块简单地使matplotlib将其“图形”或绘画处理为坐标,并将这些坐标投射到真实世界的地理投影中。现在我看到了一些有关如何将matplotlib嵌入Tkinter的问题和指南,但这些都涉及创建一个matplotlib Figure(),然后使用show()方法和FigureCanvasTkAgg()在该图中,而创建cartopy地图的说明通常只需使用pyplot的axes()方法,同时提供cartopy投影对象,然后使用pyplot模块(而不是Figure对象)的show()。我尝试了一些不同的方法,但我只是无法理解如何协调这两种方法(创建cartopy matplotlib和将matplotlib嵌入Tkinter)。我有制图,Python和Tkinter方面的经验,但我是新手matplotlib和cartopy,所以可能是因为我还不了解这些模块。
如果有人能提出具体的代码示例进行回答,那将非常有帮助。还可以看到如何在新嵌入的cartopy地图中绘制线条或点的示例,例如我要在哪个对象上使用.plot()方法?
长远来看,希望能够通过Tkinter GUI应用程序与cartopy地图进行交互。顺便说一下,有人以前做过这样的cartopy Tkinter嵌入吗?
--->回答:感谢@Pelson提供答案和代码示例。根据我理解,关键步骤是1)创建一个matplot图,2)通过包括投影参数来添加一个轴到图中(从而使其成为Cartopy轴),并3)使用FigureCanvasTkAgg函数将图转换为Tkinter小部件,然后使用它的show()和get_tk_widget()方法在Tkinter窗口中打包或放置小部件。

pyplot是一个模块而不是对象。方法在底层都是相同的,只是其中一个有更多的便利包装器。 - tacaswell
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 screenshot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接