-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathui.py
More file actions
162 lines (129 loc) · 5.65 KB
/
ui.py
File metadata and controls
162 lines (129 loc) · 5.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
import tkinter as tk
from tkinter import scrolledtext, filedialog, messagebox
import threading
import datetime
class FocusBox(tk.Toplevel):
def __init__(self, parent):
super().__init__(parent)
self.title("VisionText Focus")
self.geometry("650x1125+100+100")
self.attributes("-topmost", True)
# Windows transparency setup
self.transparent_color = 'grey15'
self.attributes('-transparentcolor', self.transparent_color)
self.configure(bg=self.transparent_color)
# Main container (The Red Border)
self.border_color = "red"
self.border_width = 5
self.container = tk.Frame(self, bg=self.border_color)
self.container.pack(fill=tk.BOTH, expand=True)
# Inner transparent area
self.inner = tk.Frame(self.container, bg=self.transparent_color, cursor="cross")
self.inner.pack(fill=tk.BOTH, expand=True, padx=self.border_width, pady=self.border_width)
self.withdraw()
def set_size(self, w, h):
# Keep current position, update size
# Note: geometry string format is WxH+X+Y
# We need to be careful if X/Y are not yet set or valid.
try:
x = self.winfo_x()
y = self.winfo_y()
self.geometry(f"{w}x{h}+{x}+{y}")
except:
self.geometry(f"{w}x{h}")
def show(self):
self.deiconify()
def hide(self):
self.withdraw()
def get_geometry(self):
# Returns coordinates of the inner capture area relative to screen
# Use winfo_rootx/y to get absolute screen coordinates of the inner frame
# This automatically accounts for title bars and borders.
# Ensure we have up-to-date coordinates
self.inner.update_idletasks()
x = self.inner.winfo_rootx()
y = self.inner.winfo_rooty()
w = self.inner.winfo_width()
h = self.inner.winfo_height()
return {'top': y, 'left': x, 'width': w, 'height': h}
class VisionTextUI:
def __init__(self, root, on_start, on_stop, on_save):
self.root = root
self.root.title("VisionText v0.1")
self.root.geometry("1200x1200")
self.on_start = on_start
self.on_stop = on_stop
self.on_save = on_save
self.is_capturing = False
# --- Controls Frame ---
self.controls_frame = tk.Frame(root, padx=5, pady=5)
self.controls_frame.pack(side=tk.TOP, fill=tk.X)
self.btn_focus = tk.Button(self.controls_frame, text="Toggle Focus Box", command=self.toggle_focus)
self.btn_focus.pack(side=tk.LEFT, padx=5)
self.btn_start = tk.Button(self.controls_frame, text="Start Capture", bg="#ddffdd", command=self.toggle_capture)
self.btn_start.pack(side=tk.LEFT, padx=5)
self.btn_save = tk.Button(self.controls_frame, text="Save to File", command=self.save_file)
self.btn_save.pack(side=tk.LEFT, padx=5)
self.btn_clear = tk.Button(self.controls_frame, text="Clear", command=self.clear_text)
self.btn_clear.pack(side=tk.RIGHT, padx=5)
# --- Text Area ---
self.text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, font=("Consolas", 10))
self.text_area.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
# --- Status Bar ---
self.status_var = tk.StringVar()
self.status_var.set("Ready")
self.status_bar = tk.Label(root, textvariable=self.status_var, bd=1, relief=tk.SUNKEN, anchor=tk.W)
self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)
# --- Size Controls ---
self.size_frame = tk.Frame(root, padx=5, pady=2)
self.size_frame.pack(side=tk.BOTTOM, fill=tk.X)
tk.Label(self.size_frame, text="Focus W:").pack(side=tk.LEFT)
self.entry_w = tk.Entry(self.size_frame, width=5)
self.entry_w.insert(0, "650")
self.entry_w.pack(side=tk.LEFT, padx=2)
tk.Label(self.size_frame, text="H:").pack(side=tk.LEFT)
self.entry_h = tk.Entry(self.size_frame, width=5)
self.entry_h.insert(0, "1125")
self.entry_h.pack(side=tk.LEFT, padx=2)
self.btn_resize = tk.Button(self.size_frame, text="Apply Size", command=self.update_box_size)
self.btn_resize.pack(side=tk.LEFT, padx=5)
# --- Focus Box ---
self.focus_box = FocusBox(root)
def update_box_size(self):
try:
w = int(self.entry_w.get())
h = int(self.entry_h.get())
if w > 0 and h > 0:
self.focus_box.set_size(w, h)
except ValueError:
pass
def toggle_focus(self):
if self.focus_box.state() == 'withdrawn':
self.focus_box.show()
else:
self.focus_box.hide()
def toggle_capture(self):
if not self.is_capturing:
# Start
self.is_capturing = True
self.btn_start.config(text="Stop Capture", bg="#ffdddd")
self.status_var.set("Capturing...")
self.on_start()
else:
# Stop
self.is_capturing = False
self.btn_start.config(text="Start Capture", bg="#ddffdd")
self.status_var.set("Stopped")
self.on_stop()
def append_text(self, text):
if text:
# Removed timestamp as per user request
self.text_area.insert(tk.END, f"\n{text}\n")
self.text_area.see(tk.END)
def clear_text(self):
self.text_area.delete('1.0', tk.END)
def save_file(self):
content = self.text_area.get('1.0', tk.END)
self.on_save(content)
def get_focus_geometry(self):
return self.focus_box.get_geometry()