#! /usr/bin/python3 # Last edited on 2026-01-23 16:15:12 by stolfi # Initial version generated by Google AI import sys import tkinter as tk from PIL import Image, ImageTk # ??? Check and adapt class ImagePicker: def __init__(self, root, image_path): self.root = root self.root.title(f"Image Pixel Picker - {image_path}") # Load the original image self.orig_image = Image.open(image_path) self.width, self.height = self.orig_image.size # UI State self.zoom_level = 1.0 self.offset_x = 0 self.offset_y = 0 # Create Canvas self.canvas = tk.Canvas(root, cursor="cross", bg="grey") self.canvas.pack(fill="both", expand=True) # Bind events self.canvas.bind("", self.on_click) self.canvas.bind("", self.on_drag) self.canvas.bind("", self.on_release) self.canvas.bind("", self.on_zoom) # Windows/macOS self.canvas.bind("", self.on_zoom) # Linux scroll up self.canvas.bind("", self.on_zoom) # Linux scroll down self.canvas.bind("", self.on_enter) # ENTER key self.drag_data = {"x": 0, "y": 0, "moved": False} self.render_image() self.canvas.focus_set() def render_image(self): # Calculate new size new_w = int(self.width * self.zoom_level) new_h = int(self.height * self.zoom_level) # Avoid zero size if new_w < 1 or new_h < 1: return # Resize and display resized = self.orig_image.resize((new_w, new_h), Image.Resampling.LANCZOS) self.tk_image = ImageTk.PhotoImage(resized) self.canvas.delete("all") self.canvas.create_image(self.offset_x, self.offset_y, anchor="nw", image=self.tk_image) def on_click(self, event): self.drag_data["x"] = event.x self.drag_data["y"] = event.y self.drag_data["moved"] = False def on_enter(self, event): sys.stdout.write("\n") sys.stdout.flush() def on_drag(self, event): dx = event.x - self.drag_data["x"] dy = event.y - self.drag_data["y"] if abs(dx) > 2 or abs(dy) > 2: self.drag_data["moved"] = True self.offset_x += dx self.offset_y += dy self.drag_data["x"] = event.x self.drag_data["y"] = event.y self.render_image() def on_release(self, event): # If it was a click (not a drag), report coordinates if not self.drag_data["moved"]: # Convert screen coords to image coords img_x = (event.x - self.offset_x) / self.zoom_level img_y = (event.y - self.offset_y) / self.zoom_level if 0 <= img_x < self.width and 0 <= img_y < self.height: print(f"{int(img_x)} {int(img_y)}") sys.stdout.flush() def on_zoom(self, event): # Handle different OS scroll events if event.num == 4 or event.delta > 0: factor = 1.1 else: factor = 0.9 self.zoom_level *= factor self.render_image() def main(): if len(sys.argv) < 2: print("Usage: image_picker.py ") sys.exit(1) root = tk.Tk() root.geometry("800x600") app = ImagePicker(root, sys.argv[1]) root.mainloop() return # ---------------------------------------------------------------------- main()