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

