You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

tkintermapview调用set_address触发PhotoImage属性错误及工具选型咨询

问题一:PIL PhotoImage 销毁异常解决办法

你遇到的AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'是PIL库回收PhotoImage资源时的非致命异常(程序最终退出码为0),可通过以下方法解决:

  1. 延迟执行地址定位
    让地图组件完成初始化后再调用地址定位,用tkinter的after方法实现:
from tkinter import Tk
from tkintermapview import TkinterMapView

root_tk = Tk()
root_tk.geometry(f"{600}x{400}")
root_tk.title("map_view_simple_example.py")

map_widget = TkinterMapView(root_tk, width=600, height=400, corner_radius=0)
map_widget.pack(fill="both", expand=True)

map_widget.set_tile_server("https://mt0.google.com/vt/lyrs=m&hl=en&x={x}&y={y}&z={z}&s=Ga", max_zoom=22)

# 延迟100毫秒执行地址定位,避免初始化冲突
root_tk.after(100, lambda: map_widget.set_address("chyasal"))

root_tk.mainloop()
  1. 更新依赖库版本
    该异常可能是旧版本PIL或tkintermapview的bug,执行命令更新:
pip install --upgrade pillow tkintermapview
  1. 捕获异常(临时方案)
    如果上述方法无效,可在代码开头添加异常捕获忽略该错误:
import PIL.ImageTk
original_del = PIL.ImageTk.PhotoImage.__del__
def safe_del(self):
    try:
        original_del(self)
    except AttributeError:
        pass
PIL.ImageTk.PhotoImage.__del__ = safe_del

问题二:路径规划功能的方案选择

tkintermapview的适用性

tkintermapview仅提供地图瓦片显示、地址定位、标记点绘制等基础功能,没有内置路径规划和距离计算能力。若要用它实现需求,需额外对接第三方路径API:

  • 调用Google Maps Directions API、OpenRouteService、OSRM等服务,传入起止点经纬度获取路径坐标和距离
  • 通过tkintermapview的set_path方法将路径绘制到地图上

此方案需要自行处理API请求与数据解析,适合有基础API开发经验的场景。

替代方案

  1. 嵌入网页版谷歌地图
    使用pywebview库在tkinter窗口中嵌入网页,直接利用谷歌地图JavaScript API的成熟路径规划功能。优点是无需自行开发路径逻辑;缺点是依赖联网,且需要掌握基础HTML/JavaScript知识。

  2. folium+webview组合
    用folium生成包含路径规划的地图HTML,再通过webview嵌入tkinter。folium支持对接OpenStreetMap生成路径,开发成本比直接写前端低,同样需要联网。

  3. 开源本地路径规划
    使用osmnx库从OpenStreetMap获取道路数据,在本地计算最短路径后绘制到tkintermapview上。优点是无需依赖第三方API,数据本地化;缺点是需处理复杂地图数据,开发成本较高。


内容的提问来源于stack exchange,提问作者Chrishdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:55:19