Advertisement
here2share

# tk_create_rotated_text.py

Jun 14th, 2025
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.28 KB | None | 0 0
  1. # tk_create_rotated_text.py
  2.  
  3. import math
  4. import tkinter as tk
  5. from tkinter import Canvas
  6. import time
  7. from PIL import Image, ImageDraw, ImageFont, ImageTk
  8.  
  9. ww = 640
  10. hh = 640
  11. root = tk.Tk()
  12. root.title("list_zoom.py")
  13. root.geometry(f"{ww}x{hh}+0+0")
  14. cell_size = 40
  15. font_size = 10
  16. n = 10
  17. grid_size = 20 * cell_size
  18. squares = {}
  19. cell_order = []
  20. visited = set()
  21. drag_start_x = 0
  22. drag_start_y = 0
  23. canvas = tk.Canvas(root, width=ww, height=hh, bg="white")
  24. canvas.pack(fill=tk.BOTH, expand=True)
  25.  
  26. def create_rotated_text(text, angle, font_size=10):
  27.     try:
  28.         temp_img = Image.new('RGBA', (200, 200), (255, 255, 255, 0))
  29.         temp_draw = ImageDraw.Draw(temp_img)
  30.        
  31.         try:
  32.             font = ImageFont.truetype("arial.ttf", font_size)
  33.         except:
  34.             try:
  35.                 font = ImageFont.load_default()
  36.             except:
  37.                 font = None
  38.        
  39.         if font:
  40.             bbox = temp_draw.textbbox((0, 0), text, font=font)
  41.             text_width = bbox[2] - bbox[0]
  42.             text_height = bbox[3] - bbox[1]
  43.         else:
  44.             text_width = len(text) * font_size // 2
  45.             text_height = font_size
  46.        
  47.         img_size = max(text_width, text_height) + 20
  48.         img = Image.new('RGBA', (img_size, img_size), (255, 255, 255, 0))
  49.         draw = ImageDraw.Draw(img)
  50.        
  51.         text_x = (img_size - text_width) // 2
  52.         text_y = (img_size - text_height) // 2
  53.        
  54.         if font:
  55.             draw.text((text_x, text_y), text, font=font, fill='black')
  56.         else:
  57.             draw.text((text_x, text_y), text, fill='black')
  58.        
  59.         rotated_img = img.rotate(angle, expand=True)
  60.        
  61.         return ImageTk.PhotoImage(rotated_img)
  62.     except Exception as e:
  63.         print(f"Error creating rotated text: {e}")
  64.         return None
  65.  
  66. # Create grid cells
  67. for x in range(-n, n):
  68.     for y in range(-n, n):
  69.         canvas_x = (x + n) * cell_size
  70.         canvas_y = (-y + n - 1) * cell_size
  71.         rect_id = canvas.create_rectangle(
  72.             canvas_x,
  73.             canvas_y,
  74.             canvas_x + cell_size,
  75.             canvas_y + cell_size,
  76.             outline="black",
  77.             fill="white",
  78.             tag="cells",
  79.         )
  80.         squares[(x, y)] = rect_id
  81.        
  82.         # Create rotated text
  83.         text_x = canvas_x + cell_size // 2
  84.         text_y = canvas_y + cell_size // 2
  85.        
  86.         rotated_text_img = create_rotated_text(f"{x},{y}", 45, 12)
  87.        
  88.         if rotated_text_img:
  89.             canvas.create_image(
  90.                 text_x,
  91.                 text_y,
  92.                 image=rotated_text_img,
  93.                 anchor='center'
  94.             )
  95.             if not hasattr(canvas, 'text_images'):
  96.                 canvas.text_images = []
  97.             canvas.text_images.append(rotated_text_img)
  98.         else:
  99.             canvas.create_text(
  100.                 text_x,
  101.                 text_y,
  102.                 text=f"{x},{y}",
  103.                 font=("Arial", 12),
  104.                 fill="black",
  105.             )
  106.  
  107. span = int((n ** 2 + n ** 2) ** 0.5) + 1
  108. for angle_deg in range(90):
  109.     angle_rad = math.radians(angle_deg)
  110.     cos_val = math.cos(angle_rad)
  111.     sin_val = math.sin(angle_rad)
  112.     for r in range(span):
  113.         x = int(r * cos_val)
  114.         y = int(r * sin_val)
  115.         if (x, y) in visited:
  116.             continue
  117.        
  118.         quadrants = [
  119.             (x, y),
  120.             (-y-1, x),
  121.             (-x-1, -y-1),
  122.             (y, -x-1)
  123.         ]
  124.        
  125.         for qx, qy in quadrants:
  126.             cell_order.append((qx, qy))
  127.             visited.add((qx, qy))
  128.  
  129. grid_colors = {
  130.     (0, 0): (255, 255, 255),
  131.     (0, 1): (255, 255, 0),
  132.     (0, 2): (0, 255, 0),
  133.     (1, 0): (255, 165, 0),
  134.     (1, 1): (128, 128, 128),
  135.     (1, 2): (0, 0, 255),
  136.     (2, 0): (255, 0, 0),
  137.     (2, 1): (128, 0, 128),
  138.     (2, 2): (0, 0, 0)
  139. }
  140.  
  141. def interpolate_color(x, y):
  142.     norm_x = (x + n) / (2 * n) * 2
  143.     norm_y = (y + n) / (2 * n) * 2
  144.     x0 = int(norm_x)
  145.     x1 = min(x0 + 1, 2)
  146.     y0 = int(norm_y)
  147.     y1 = min(y0 + 1, 2)
  148.     c00 = grid_colors.get((x0, y0), (255, 255, 255))
  149.     c10 = grid_colors.get((x1, y0), (255, 255, 255))
  150.     c01 = grid_colors.get((x0, y1), (255, 255, 255))
  151.     c11 = grid_colors.get((x1, y1), (255, 255, 255))
  152.     dx = norm_x - x0
  153.     dy = norm_y - y0
  154.     top = [c00[i] * (1 - dx) + c10[i] * dx for i in range(3)]
  155.     bottom = [c01[i] * (1 - dx) + c11[i] * dx for i in range(3)]
  156.     color = [top[i] * (1 - dy) + bottom[i] * dy for i in range(3)]
  157.     return f'#{int(color[0]):02x}{int(color[1]):02x}{int(color[2]):02x}'
  158.  
  159. def detect_color(x, y):
  160.     return None
  161.  
  162. def start_drag(event):
  163.     global drag_start_x, drag_start_y
  164.     drag_start_x = event.x
  165.     drag_start_y = event.y
  166.     canvas.config(cursor="fleur")
  167.  
  168. def drag_canvas(event):
  169.     global drag_start_x, drag_start_y
  170.     dx = event.x - drag_start_x
  171.     dy = event.y - drag_start_y
  172.     canvas.move("all", dx, dy)
  173.     drag_start_x = event.x
  174.     drag_start_y = event.y
  175.  
  176. def stop_drag(event):
  177.     canvas.config(cursor="")
  178.  
  179. interpolated_colors = {}
  180. for x in range(-n, n):
  181.     for y in range(-n, n):
  182.         interpolated_colors[(x, y)] = interpolate_color(x, y)
  183.        
  184. for x, y in cell_order:
  185.     if (x, y) in squares:
  186.         canvas.itemconfig(squares[(x, y)], fill=interpolated_colors[(x, y)])
  187.         if detect_color(x, y):
  188.             canvas.itemconfig(squares[(x, y)], fill="red")
  189.         canvas.update()
  190.  
  191. canvas.bind("<Button-1>", start_drag)
  192. canvas.bind("<B1-Motion>", drag_canvas)
  193. canvas.bind("<ButtonRelease-1>", stop_drag)
  194. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement