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

使用tkinterdnd2拖放的栅格绘图后无法更改(符合预期)

栅格文件拖放与分布可视化工具

这段Python代码实现了以下功能:

  • 无需关闭窗口或重新运行代码,即可多次通过拖放新的栅格文件切换数据源,并能在新窗口显示选中文件的完整路径
  • 绘制栅格数据的分布直方图后,将无法再切换栅格文件,这一行为符合预期需求
import os
import tkinter as tk
from tkinterdnd2 import TkinterDnD, DND_FILES
import rasterio
import matplotlib.pyplot as plt
from tkinter import messagebox

class SimpleApp(TkinterDnD.Tk):
    def __init__(self):
        super().__init__()
        self.title("Simple File Selector")
        self.geometry("400x400")

        self.file_label = tk.Label(self, text="Drop a file here", relief="solid", width=40, height=5)
        self.file_label.pack(pady=20)
        self.file_label.drop_target_register(DND_FILES)
        self.file_label.dnd_bind('<<Drop>>', self.load_file)

        self.print_button = tk.Button(self, text="Display Filename", command=self.display_filename)
        self.print_button.pack(pady=20)

        self.plot_button = tk.Button(self, text="Plot Distribution", command=self.plot_distribution)
        self.plot_button.pack(pady=20)

    def load_file(self, event):
        self.file_path = event.data.strip('{}')
        self.file_label.config(text=os.path.basename(self.file_path) if self.file_path else "No file selected")
        try:
            with rasterio.open(self.file_path) as src:
                self.raster_data = src.read(1)
        except Exception as e:
            messagebox.showerror("Error", f"Failed to read raster file: {e}")
            self.file_label.config(text="Drop a file here")
            self.raster_data = None

    def display_filename(self):
        if hasattr(self, 'file_path') and self.file_path:
            filename_window = tk.Toplevel(self)
            filename_window.title("Selected File")
            filename_window.geometry("300x100")
            filename_label = tk.Label(filename_window, text=self.file_path, wraplength=280)
            filename_label.pack(pady=20)
        else:
            messagebox.showerror("Error", "No file selected")

    def plot_distribution(self):
        if hasattr(self, 'raster_data') and self.raster_data is not None:
            plt.figure()
            plt.hist(self.raster_data.flatten(), bins=50, color='blue', edgecolor='black')
            plt.title('Raster Data Distribution')
            plt.xlabel('Value')
            plt.ylabel('Frequency')
            plt.show()
        else:
            messagebox.showerror("Error", "No raster data to plot")

if __name__ == "__main__":
    app = SimpleApp()
    app.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:10:18