编程语言
首页 > 编程语言> > 如何在Python Tkinter GUI中嵌入Cartopy?

如何在Python Tkinter GUI中嵌入Cartopy?

作者:互联网

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

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

如果有人可以提出一个具体的代码示例及其答案,那将非常有帮助.看到我如何在新的嵌入式Cartopy地图中绘制线或点的示例(例如,我在哪个对象上使用.plot()方法?

从长远来看,希望是能够通过Tkinter GUI应用程序与Cartopy Map进行交互.顺便说一句,以前有没有人做过类似Tkinter嵌入的Cartopy?

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

解决方法:

Cartopy和pyplot没什么特别的-一切也可以与matplotlib的OO接口一起使用.这意味着将Cartopy轴嵌入与将matplotlib轴嵌入任何GUI工具包一样困难.

在这种情况下,我以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应用程序:

标签:cartopy,matplotlib,tkinter,embed,python
来源: https://codeday.me/bug/20191030/1965432.html