Kar*_*gat 3 python embed tkinter matplotlib cartopy
我想在 Python (2.7) Tkinter GUI 应用程序(在 Windows 7 PC 上)中嵌入 Cartopy 模块映射,但我需要帮助来弄清楚如何实现。
据我了解,Cartopy 模块只是使 matplotlib 将其“绘图”或绘图视为坐标并将其投影到现实世界的地理投影。现在我已经看到了有关如何将 matplotlib 嵌入到 Tkinter 中的问题和指南,但这些总是涉及创建 matplotlib 图(),然后在该图上使用 show() 方法和FigureCanvasTkAgg(),而创建 cartopy 地图的说明通常是简单地使用 pyplot 的axes()方法,同时提供cartopy投影对象,然后将show()与pyplot模块(而不是Figure对象)一起使用。我尝试了一些不同的方法,但我无法理解如何协调这两种方法(创建 cartopy matplotlib 并在 Tkinter 中嵌入 matplotlib)。我有制图、Python 和 Tkinter 方面的经验,但我对 matplotlib 和 cartopy 还很陌生,所以可能我对这些模块还不够了解。
如果有人可以建议一个具体的代码示例以及他们的答案,那将是最有帮助的。如果能看到一个示例,说明如何在新的嵌入式 cartopy 地图中绘制线或点,例如我应该在哪个对象上使用 .plot() 方法,那就太好了?
从长远来看,希望能够通过 Tkinter GUI 应用程序与 cartopy 地图进行交互。顺便说一句,以前有人做过这样的 cartopy Tkinter 嵌入吗?
---> 回答:感谢@Pelson 的回答,并提供了代码示例。对于其他遇到同样问题的人来说,据我了解,关键步骤是 1)创建一个 matplot 图形,2)通过包含投影参数向图形添加轴(从而使其成为 Cartopy 轴),以及 3)转换图形通过使用FigureCanvasTkAgg 函数将其添加到 Tkinter 小部件,然后使用其 show() 和 get_tk_widget() 方法将小部件打包或放置在 Tkinter 窗口中。
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()
Run Code Online (Sandbox Code Playgroud)
我的完整应用程序如下所示:
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()
Run Code Online (Sandbox Code Playgroud)
生成如下所示的 Tkinter GUI 应用程序:

| 归档时间: |
|
| 查看次数: |
2247 次 |
| 最近记录: |