Add grid.py
This commit is contained in:
132
grid.py
Normal file
132
grid.py
Normal file
@@ -0,0 +1,132 @@
|
||||
# og source - thirds.exe
|
||||
import tkinter as tk
|
||||
import ctypes
|
||||
from PIL import Image, ImageTk
|
||||
from pynput import mouse, keyboard
|
||||
|
||||
# Windows Constants
|
||||
WS_EX_LAYERED = 0x00080000
|
||||
WS_EX_TRANSPARENT = 0x00000020
|
||||
GWL_EXSTYLE = -20
|
||||
HWND_TOPMOST = -1
|
||||
SWP_NOSIZE = 0x0001
|
||||
SWP_NOMOVE = 0x0002
|
||||
SWP_NOACTIVATE = 0x0010
|
||||
|
||||
def make_window_click_through(hwnd):
|
||||
styles = ctypes.windll.user32.GetWindowLongPtrW(hwnd, GWL_EXSTYLE)
|
||||
ctypes.windll.user32.SetWindowLongPtrW(hwnd, GWL_EXSTYLE, styles | WS_EX_LAYERED | WS_EX_TRANSPARENT)
|
||||
|
||||
def make_window_always_on_top(hwnd):
|
||||
ctypes.windll.user32.SetWindowPos(
|
||||
hwnd, HWND_TOPMOST, 0, 0, 0, 0,
|
||||
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE
|
||||
)
|
||||
|
||||
def create_red_square_icon(size=16):
|
||||
img = Image.new("RGBA", (size, size), color=(255, 0, 0, 255))
|
||||
return ImageTk.PhotoImage(img)
|
||||
|
||||
def main():
|
||||
root = tk.Tk()
|
||||
root.title("Thirds")
|
||||
|
||||
# 1
|
||||
icon_image = create_red_square_icon(size=32)
|
||||
root.iconphoto(True, icon_image)
|
||||
|
||||
# 2
|
||||
root.overrideredirect(True)
|
||||
root.wm_attributes("-topmost", True)
|
||||
|
||||
# 3
|
||||
screen_width = root.winfo_screenwidth()
|
||||
screen_height = root.winfo_screenheight()
|
||||
|
||||
# 4
|
||||
root.geometry(f"{screen_width}x{screen_height}+0+0")
|
||||
|
||||
# 5
|
||||
TRANSPARENT_COLOR = "magenta"
|
||||
root.config(bg=TRANSPARENT_COLOR)
|
||||
root.wm_attributes("-transparentcolor", TRANSPARENT_COLOR)
|
||||
|
||||
# Rule-of-Thirds lines
|
||||
canvas = tk.Canvas(
|
||||
root,
|
||||
width=screen_width,
|
||||
height=screen_height,
|
||||
highlightthickness=0,
|
||||
bg=TRANSPARENT_COLOR
|
||||
)
|
||||
canvas.pack()
|
||||
|
||||
# Rule of Thirds lines
|
||||
line_v1 = canvas.create_line(screen_width/3, 0,
|
||||
screen_width/3, screen_height,
|
||||
fill="red", width=2)
|
||||
line_v2 = canvas.create_line(2*screen_width/3, 0,
|
||||
2*screen_width/3, screen_height,
|
||||
fill="red", width=2)
|
||||
line_h1 = canvas.create_line(0, screen_height/3,
|
||||
screen_width, screen_height/3,
|
||||
fill="red", width=2)
|
||||
line_h2 = canvas.create_line(0, 2*screen_height/3,
|
||||
screen_width, 2*screen_height/3,
|
||||
fill="red", width=2)
|
||||
|
||||
# window to be drawn
|
||||
root.update_idletasks()
|
||||
|
||||
# native window handle via the window title
|
||||
hwnd = ctypes.windll.user32.FindWindowW(None, "Rule of Thirds Overlay")
|
||||
if not hwnd:
|
||||
hwnd = root.winfo_id() # fallback
|
||||
|
||||
# window click-through
|
||||
make_window_click_through(hwnd)
|
||||
|
||||
# window always on top
|
||||
make_window_always_on_top(hwnd)
|
||||
|
||||
|
||||
# Listeners
|
||||
grid_visible = True
|
||||
|
||||
def toggle_grid():
|
||||
nonlocal grid_visible
|
||||
grid_visible = not grid_visible
|
||||
new_state = "normal" if grid_visible else "hidden"
|
||||
for line_id in (line_v1, line_v2, line_h1, line_h2):
|
||||
canvas.itemconfig(line_id, state=new_state)
|
||||
|
||||
def change_color(new_color):
|
||||
for line_id in (line_v1, line_v2, line_h1, line_h2):
|
||||
canvas.itemconfig(line_id, fill=new_color)
|
||||
|
||||
def close_program():
|
||||
root.destroy()
|
||||
|
||||
|
||||
def on_click(x, y, button, pressed):
|
||||
if pressed and button == mouse.Button.middle:
|
||||
toggle_grid()
|
||||
|
||||
mouse_listener = mouse.Listener(on_click=on_click)
|
||||
mouse_listener.start()
|
||||
|
||||
|
||||
hotkeys = keyboard.GlobalHotKeys({
|
||||
'<shift>+1': lambda: change_color('red'), # Shift+1 → Red
|
||||
'<shift>+2': lambda: change_color('light green'), # Shift+2 → Light green
|
||||
'<shift>+3': lambda: change_color('white'), # Shift+3 → White
|
||||
'<shift>+4': lambda: change_color('black'), # Shift+4 → Black
|
||||
'<ctrl>+1': close_program # Ctrl+1 → Close
|
||||
})
|
||||
hotkeys.start()
|
||||
|
||||
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user