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

Python Tkinter地图雨云数据叠加遮挡问题求助(多方案失败)

问题描述

我用Python的Tkinter开发天气雷达系统,地图和雨云数据都能悬浮显示,但雨云数据完全遮挡了地图。

我试过以下方案均未解决:

  • 用Canvas设置地图透明度为50%,通过ImageGrab捕获图像调暗并设置透明度,结果出现白屏;
  • 改用Pillow调整地图图像透明度后绘制到Tkinter Canvas,仍出现白屏;
  • 尝试不使用Canvas,通过tkintermapview设置雷达瓦片、调整UI背景,依旧白屏;
  • 尝试用Basemap(mpl_toolkits.basemap)+Matplotlib、Cartopy+Matplotlib绘制地图并集成Tkinter,均未成功。
代码示例
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk, ImageDraw
import requests
import tkintermapview
import math

class WeatherRadar:
    def __init__(self, root):
        self.root = root
        self.root.title("WRS")
        self.root.state('zoomed')

        self.create_top_section()
        self.create_bottom_section()
        self.overlay_global_rainfall()  #비구름 데이터

    def create_top_section(self):
        top_frame = ttk.Frame(self.root)
        top_frame.pack(side=tk.TOP, fill=tk.X, expand=False)

        # 날씨 정보 표시
        self.track_temp_label = ttk.Label(top_frame, text="Track Temp: N/A")
        self.track_temp_label.grid(row=1, column=0, padx=10, pady=10)
        self.humidity_label = ttk.Label(top_frame, text="Humidity: N/A")
        self.humidity_label.grid(row=1, column=1, padx=10, pady=10)
        self.air_temp_label = ttk.Label(top_frame, text="Air Temp: N/A")
        self.air_temp_label.grid(row=1, column=2, padx=10, pady=10)
        self.wind_speed_label = ttk.Label(top_frame, text="Wind Speed: N/A")
        self.wind_speed_label.grid(row=1, column=3, padx=10, pady=10)

        wind_frame = ttk.Frame(top_frame)
        wind_frame.grid(row=1, column=4, padx=10, pady=10)
        self.wind_direction_label = ttk.Label(wind_frame, text="Wind Direction: N/A")
        self.wind_direction_label.pack(side=tk.LEFT)

        self.wind_direction_canvas = tk.Canvas(wind_frame, width=50, height=50)
        self.wind_direction_canvas.pack(side=tk.LEFT)

        # Rain forecast
        self.rain_forecast_entry_eta_label = ttk.Label(top_frame, text="Rain ETA: N/A")
        self.rain_forecast_entry_eta_label.grid(row=2, column=0, padx=10, pady=10)
        self.rain_forecast_exit_eta_label = ttk.Label(top_frame, text="Rain Exit ETA: N/A")
        self.rain_forecast_exit_eta_label.grid(row=2, column=1, padx=10, pady=10)
        self.rain_intensity_label = ttk.Label(top_frame, text="Rain Intensity: N/A mm/h")
        self.rain_intensity_label.grid(row=2, column=2, padx=10, pady=10)

    def create_bottom_section(self):
        bottom_frame = ttk.Frame(self.root)
        bottom_frame.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)

        # 지도 표시
        self.map_widget = tkintermapview.TkinterMapView(bottom_frame, corner_radius=0)
        self.map_widget.pack(fill="both", expand=True)
        self.map_widget.set_zoom(16)  # 초기 줌 레벨을 16으로 설정하여 더 확대된 상태로 시작

    def fetch_weather_data(self, lat, lon):
        api_key = " api key "
        url = f"http://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={api_key}&units=metric"
        response = requests.get(url)
        if response.status_code == 200:
            data = response.json()
            track_temp = data['main']['temp']
            humidity = data['main']['humidity']
            air_temp = data['main']['feels_like']
            wind_speed = data['wind']['speed']
            wind_deg = data['wind']['deg']

            self.track_temp_label.config(text=f"Track Temp: {track_temp}°C")
            self.humidity_label.config(text=f"Humidity: {humidity}%")
            self.air_temp_label.config(text=f"Air Temp: {air_temp}°C")
            self.wind_speed_label.config(text=f"Wind Speed: {wind_speed} m/s")
            self.wind_direction_label.config(text=f"Wind Direction: {wind_deg}°")

            self.update_wind_direction_canvas(wind_deg)

            # For now, setting rain forecast to N/A
            self.rain_forecast_entry_eta_label.config(text="Rain ETA: N/A")
            self.rain_forecast_exit_eta_label.config(text="Rain Exit ETA: N/A")
            self.rain_intensity_label.config(text="Rain Intensity: N/A mm/h")
        else:
            print("Failed to fetch weather data")

    def overlay_global_rainfall(self):
        # OpenWeatherMap 레이더 타일 URL 패턴
        radar_tile_url = "https://tile.openweathermap.org/map/precipitation_new/{z}/{x}/{y}.png?appid="
        self.map_widget.set_tile_server(radar_tile_url)

    def update_wind_direction_canvas(self, wind_deg):
        self.wind_direction_canvas.delete("all")
        center_x, center_y = 25, 25
        length = 20
        angle_rad = math.radians(wind_deg)

        end_x = center_x + length * math.cos(angle_rad)
        end_y = center_y - length * math.sin(angle_rad)

        self.wind_direction_canvas.create_line(center_x, center_y, end_x, end_y, arrow=tk.LAST, fill="blue", width=2)



if __name__ == "__main__":
    root = tk.Tk()
    app = WeatherRadar(root)
    root.mainloop()
需求

求解决雨云数据遮挡地图的问题,实现地图与雨云数据同时可见。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:32:03