【问题标题】:How to Embed Cartopy in a Python Tkinter GUI?如何在 Python Tkinter GUI 中嵌入 Cartopy?
【发布时间】:2013-12-21 12:50:18
【问题描述】:

我想在 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 方面的经验,但我是 matplotlib 和 cartopy 的新手,所以我可能对这些模块还不够了解。

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

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

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

【问题讨论】:

  • pyplot 是一个模块而不是一个对象。下面的方法是相同的,只是在它上面有更多的便利包装器。

标签: python matplotlib tkinter embed cartopy


【解决方案1】:

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 应用程序,如下所示:

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 2016-04-26
    • 2021-12-04
    • 1970-01-01
    • 2018-08-19
    • 2022-12-12
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多