Skip to content

Commit 39f8b19

Browse files
committed
add a gui recorder
1 parent ce4ac5b commit 39f8b19

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed

examples/gui_recorder.py

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
import tkinter as tk
2+
from tkinter import messagebox
3+
from warnings import filterwarnings
4+
5+
from pyscreenrec import ScreenRecorder, ScreenRecordingInProgress, NoScreenRecordingInProgress
6+
7+
filterwarnings("error")
8+
9+
COORDINATES = None
10+
11+
class RegionSelector(tk.Toplevel):
12+
def __init__(self, parent):
13+
super().__init__(parent)
14+
self.title("Select Recording Region")
15+
self.geometry("800x600")
16+
self.attributes('-alpha', 0.3)
17+
self.attributes('-fullscreen', True)
18+
self.configure(background='grey')
19+
20+
self.start_x = None
21+
self.start_y = None
22+
self.end_x = None
23+
self.end_y = None
24+
25+
self.canvas = tk.Canvas(self, highlightthickness=0)
26+
self.canvas.pack(fill='both', expand=True)
27+
28+
self.canvas.bind('<Button-1>', self.start_selection)
29+
self.canvas.bind('<B1-Motion>', self.update_selection)
30+
self.canvas.bind('<ButtonRelease-1>', self.end_selection)
31+
32+
self.selection_rect = None
33+
34+
def start_selection(self, event):
35+
self.start_x = event.x
36+
self.start_y = event.y
37+
if self.selection_rect:
38+
self.canvas.delete(self.selection_rect)
39+
40+
def update_selection(self, event):
41+
if self.selection_rect:
42+
self.canvas.delete(self.selection_rect)
43+
self.selection_rect = self.canvas.create_rectangle(
44+
self.start_x, self.start_y, event.x, event.y, outline='red'
45+
)
46+
47+
def end_selection(self, event):
48+
self.end_x = event.x
49+
self.end_y = event.y
50+
global COORDINATES
51+
COORDINATES = self.get_coordinates()
52+
self.destroy()
53+
54+
def get_coordinates(self):
55+
# Ensure coordinates are in the correct order
56+
left = min(self.start_x, self.end_x)
57+
top = min(self.start_y, self.end_y)
58+
x2 = max(self.start_x, self.end_x)
59+
y2 = max(self.start_y, self.end_y)
60+
width = x2 - left
61+
height = y2 - top
62+
return {
63+
"top": top,
64+
"left": left,
65+
"height": height,
66+
"width": width,
67+
}
68+
69+
70+
class GUIScreenRecorder(tk.Tk):
71+
def __init__(self):
72+
super().__init__()
73+
self.title("Screen Recorder")
74+
self.geometry("500x400")
75+
76+
self.recorder = ScreenRecorder()
77+
78+
self.start_button = tk.Button(self, text="Start Recording", command=self.start_recording)
79+
self.start_button.pack(pady=10)
80+
81+
self.select_region_button = tk.Button(self, text="Select Region", command=self.select_recording_region)
82+
self.select_region_button.pack(pady=10)
83+
84+
self.pause_button = tk.Button(self, text="Pause Recording", command=self.pause_recording)
85+
self.pause_button.pack(pady=10)
86+
87+
self.resume_button = tk.Button(self, text="Resume Recording", command=self.resume_recording)
88+
self.resume_button.pack(pady=10)
89+
90+
self.stop_button = tk.Button(self, text="Stop Recording", command=self.stop_recording)
91+
self.stop_button.pack(pady=10)
92+
93+
self.filename_entry = tk.Entry(self, width=40)
94+
self.filename_entry.pack(pady=10)
95+
self.filename_entry.insert(0, "Recording.mp4")
96+
97+
self.fps_entry = tk.Entry(self, width=10)
98+
self.fps_entry.pack(pady=10)
99+
self.fps_entry.insert(0, "30")
100+
101+
def select_recording_region(self):
102+
selector = RegionSelector(self)
103+
selector.mainloop()
104+
105+
def start_recording(self):
106+
try:
107+
filename = self.filename_entry.get()
108+
fps = int(self.fps_entry.get())
109+
self.recorder.start_recording(filename, fps, COORDINATES)
110+
messagebox.showinfo("Recording Started", "Screen recording has started.")
111+
except (ValueError, SyntaxError):
112+
messagebox.showerror("Invalid Input", "Please enter valid values for the filename and FPS.")
113+
except ScreenRecordingInProgress:
114+
messagebox.showerror("Recording in Progress", "Screen recording is already in progress.")
115+
116+
def pause_recording(self):
117+
try:
118+
self.recorder.pause_recording()
119+
messagebox.showinfo("Recording Paused", "Screen recording has been paused.")
120+
except NoScreenRecordingInProgress:
121+
messagebox.showerror("No Recording", "No screen recording is in progress.")
122+
123+
def resume_recording(self):
124+
try:
125+
self.recorder.resume_recording()
126+
messagebox.showinfo("Recording Resumed", "Screen recording has been resumed.")
127+
except ScreenRecordingInProgress:
128+
messagebox.showerror("Recording in Progress", "Screen recording is already in progress.")
129+
130+
def stop_recording(self):
131+
try:
132+
self.recorder.stop_recording()
133+
messagebox.showinfo("Recording Stopped", "Screen recording has stopped.")
134+
except NoScreenRecordingInProgress:
135+
messagebox.showerror("No Recording", "No screen recording is in progress.")
136+
137+
138+
if __name__ == "__main__":
139+
app = GUIScreenRecorder()
140+
app.mainloop()

0 commit comments

Comments
 (0)