【发布时间】:2021-06-13 15:20:57
【问题描述】:
我有以下设置:一个 tkinter 应用程序有一个静态真实地图,它是通过绘制两个地理数据框(用于陆地和水)绘制的,两者都具有统一的形状:
def make_figure(self, map):
land = map.land.to_crs(epsg=4326)
water = map.water.to_crs(epsg=4326)
xmin, ymin, xmax, ymax = map.contour.bounds
fig, ax = plt.subplots(figsize=(8, 9), dpi=100)
fig.subplots_adjust(left=0.01, right=0.99, top=0.99, bottom=0.01)
plt.axis('off')
ax.set_xlim([xmin,xmax])
ax.set_ylim([ymin,ymax])
water.plot(ax=ax, facecolor='lightskyblue')
land.plot(ax=ax, edgecolor='grey', facecolor='cornsilk', linewidth=1, alpha=1)
return fig, ax
然后返回的图形和轴以标准方式嵌入到 tkinter 画布中:
self.canvas = FigureCanvasTkAgg(fig, draw_frame)
self.canvas.draw()
self.canvas.get_tk_widget().pack()
self.toolbar = NavigationToolbar2Tk(self.canvas, draw_frame)
在这个 tkinter 的应用程序中还有一些模型,它执行所有基于代理的操作,例如移动和旋转,并在每一步更新它们的形状。我想要做的是尽可能平滑动态代理的形状更新。目前对我来说唯一可行的解决方案是这样的(我们通过 self.model 对象收到 Shapely shapes 的列表,在它在 tkinter 的循环中执行 step() 方法之后):
def update_agents_shapes(self):
shapes = self.model.get_new_shapes()
self.ax.patches = []
for shape in shapes:
patch = PolygonPatch(shape, fc="green", ec="green", alpha=0.5, zorder=2)
self.ax.add_patch(patch)
它的作用:它从轴(上面还绘制了一个静态地图)中删除所有补丁(笛卡尔PolygonPatches)并再次添加它们,以更新的形状重新创建。
此解决方案有效,但明显冻结了我的 tkinter 应用程序。我知道,使用 matplotlib 动画应该更容易,基本上我的形状是矩形,每一步都在旋转和移动。基本上我知道质心的新坐标和新的航向角,这足以重建形状。
我的问题是:1)如何在静态地图上制作动画,如果您从“外部”接收动态对象形状的更新并且最好接收为 Shapely 对象? 2)如何将此解决方案嵌入到具有最佳性能的 tkinter 应用程序中?我的选项性能不好,主要是对平移/缩放反应很慢
【问题讨论】:
标签: python matplotlib tkinter