Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # tk_create_rotated_text.py
- import math
- import tkinter as tk
- from tkinter import Canvas
- import time
- from PIL import Image, ImageDraw, ImageFont, ImageTk
- ww = 640
- hh = 640
- root = tk.Tk()
- root.title("list_zoom.py")
- root.geometry(f"{ww}x{hh}+0+0")
- cell_size = 40
- font_size = 10
- n = 10
- grid_size = 20 * cell_size
- squares = {}
- cell_order = []
- visited = set()
- drag_start_x = 0
- drag_start_y = 0
- canvas = tk.Canvas(root, width=ww, height=hh, bg="white")
- canvas.pack(fill=tk.BOTH, expand=True)
- def create_rotated_text(text, angle, font_size=10):
- try:
- temp_img = Image.new('RGBA', (200, 200), (255, 255, 255, 0))
- temp_draw = ImageDraw.Draw(temp_img)
- try:
- font = ImageFont.truetype("arial.ttf", font_size)
- except:
- try:
- font = ImageFont.load_default()
- except:
- font = None
- if font:
- bbox = temp_draw.textbbox((0, 0), text, font=font)
- text_width = bbox[2] - bbox[0]
- text_height = bbox[3] - bbox[1]
- else:
- text_width = len(text) * font_size // 2
- text_height = font_size
- img_size = max(text_width, text_height) + 20
- img = Image.new('RGBA', (img_size, img_size), (255, 255, 255, 0))
- draw = ImageDraw.Draw(img)
- text_x = (img_size - text_width) // 2
- text_y = (img_size - text_height) // 2
- if font:
- draw.text((text_x, text_y), text, font=font, fill='black')
- else:
- draw.text((text_x, text_y), text, fill='black')
- rotated_img = img.rotate(angle, expand=True)
- return ImageTk.PhotoImage(rotated_img)
- except Exception as e:
- print(f"Error creating rotated text: {e}")
- return None
- # Create grid cells
- for x in range(-n, n):
- for y in range(-n, n):
- canvas_x = (x + n) * cell_size
- canvas_y = (-y + n - 1) * cell_size
- rect_id = canvas.create_rectangle(
- canvas_x,
- canvas_y,
- canvas_x + cell_size,
- canvas_y + cell_size,
- outline="black",
- fill="white",
- tag="cells",
- )
- squares[(x, y)] = rect_id
- # Create rotated text
- text_x = canvas_x + cell_size // 2
- text_y = canvas_y + cell_size // 2
- rotated_text_img = create_rotated_text(f"{x},{y}", 45, 12)
- if rotated_text_img:
- canvas.create_image(
- text_x,
- text_y,
- image=rotated_text_img,
- anchor='center'
- )
- if not hasattr(canvas, 'text_images'):
- canvas.text_images = []
- canvas.text_images.append(rotated_text_img)
- else:
- canvas.create_text(
- text_x,
- text_y,
- text=f"{x},{y}",
- font=("Arial", 12),
- fill="black",
- )
- span = int((n ** 2 + n ** 2) ** 0.5) + 1
- for angle_deg in range(90):
- angle_rad = math.radians(angle_deg)
- cos_val = math.cos(angle_rad)
- sin_val = math.sin(angle_rad)
- for r in range(span):
- x = int(r * cos_val)
- y = int(r * sin_val)
- if (x, y) in visited:
- continue
- quadrants = [
- (x, y),
- (-y-1, x),
- (-x-1, -y-1),
- (y, -x-1)
- ]
- for qx, qy in quadrants:
- cell_order.append((qx, qy))
- visited.add((qx, qy))
- grid_colors = {
- (0, 0): (255, 255, 255),
- (0, 1): (255, 255, 0),
- (0, 2): (0, 255, 0),
- (1, 0): (255, 165, 0),
- (1, 1): (128, 128, 128),
- (1, 2): (0, 0, 255),
- (2, 0): (255, 0, 0),
- (2, 1): (128, 0, 128),
- (2, 2): (0, 0, 0)
- }
- def interpolate_color(x, y):
- norm_x = (x + n) / (2 * n) * 2
- norm_y = (y + n) / (2 * n) * 2
- x0 = int(norm_x)
- x1 = min(x0 + 1, 2)
- y0 = int(norm_y)
- y1 = min(y0 + 1, 2)
- c00 = grid_colors.get((x0, y0), (255, 255, 255))
- c10 = grid_colors.get((x1, y0), (255, 255, 255))
- c01 = grid_colors.get((x0, y1), (255, 255, 255))
- c11 = grid_colors.get((x1, y1), (255, 255, 255))
- dx = norm_x - x0
- dy = norm_y - y0
- top = [c00[i] * (1 - dx) + c10[i] * dx for i in range(3)]
- bottom = [c01[i] * (1 - dx) + c11[i] * dx for i in range(3)]
- color = [top[i] * (1 - dy) + bottom[i] * dy for i in range(3)]
- return f'#{int(color[0]):02x}{int(color[1]):02x}{int(color[2]):02x}'
- def detect_color(x, y):
- return None
- def start_drag(event):
- global drag_start_x, drag_start_y
- drag_start_x = event.x
- drag_start_y = event.y
- canvas.config(cursor="fleur")
- def drag_canvas(event):
- global drag_start_x, drag_start_y
- dx = event.x - drag_start_x
- dy = event.y - drag_start_y
- canvas.move("all", dx, dy)
- drag_start_x = event.x
- drag_start_y = event.y
- def stop_drag(event):
- canvas.config(cursor="")
- interpolated_colors = {}
- for x in range(-n, n):
- for y in range(-n, n):
- interpolated_colors[(x, y)] = interpolate_color(x, y)
- for x, y in cell_order:
- if (x, y) in squares:
- canvas.itemconfig(squares[(x, y)], fill=interpolated_colors[(x, y)])
- if detect_color(x, y):
- canvas.itemconfig(squares[(x, y)], fill="red")
- canvas.update()
- canvas.bind("<Button-1>", start_drag)
- canvas.bind("<B1-Motion>", drag_canvas)
- canvas.bind("<ButtonRelease-1>", stop_drag)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement