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
相关产品推荐
相关产品推荐

