Gabryelf / Gabryelf/Tools-Progs
Issue #5: Инструменты рисования (маркер) на экране
- Dominant language
- Python
- Stars
- 0
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
# ✏️ Инструмент рисования на экране
## Описание:
Реализовать инструмент, позволяющий пользователю рисовать/обводить элементы на экране во время записи, как в OBS.
## Задачи
- [x] Создать прозрачное окно для рисования поверх экрана
- [x] Реализовать рисование мышью с выбором цвета и толщины
- [x] Добавить поддержку режимов: рисование, стирание, указатель
- [x] Создать панель инструментов с выбором цвета и размера кисти
- [x] Реализовать горячие клавиши для переключения режимов
- [x] Сохранять рисунки как overlay на видео
- [x] Добавить возможность очистки рисунков
# Технические детали
## Основные классы:
```python
class DrawingOverlay(QWidget):
"""Прозрачное окно для рисования поверх экрана"""
def __init__(self):
super().__init__()
self.setWindowFlags(
Qt.FramelessWindowHint |
Qt.WindowStaysOnTopHint |
Qt.Tool
)
self.setAttribute(Qt.WA_TranslucentBackground)
self.setGeometry(0, 0, screen_width, screen_height)
self.drawing = False
self.last_point = None
self.pen_color = Qt.red
self.pen_width = 3
self.mode = 'draw' # draw, erase, pointer
self.image = QPixmap(screen_width, screen_height)
self.image.fill(Qt.transparent)
def paintEvent(self, event):
painter = QPainter(self)
painter.drawPixmap(0, 0, self.image)
def mousePressEvent(self, event):
self.drawing = True
self.last_point = event.pos()
def mouseMoveEvent(self, event):
if self.drawing:
painter = QPainter(self.image)
painter.setPen(QPen(self.pen_color, self.pen_width))
painter.drawLine(self.last_point, event.pos())
self.last_point = event.pos()
self.update()
```
## Панель инструментов:
```python
class DrawingToolbar(QToolBar):
"""Панель инструментов для рисования"""
def __init__(self):
super().__init__("Инструменты рисования")
# Выбор цвета
self.color_btn = QPushButton()
self.color_btn.setStyleSheet("background-color: red;")
self.color_btn.clicked.connect(self.choose_color)
# Размер кисти
self.size_slider = QSlider(Qt.Horizontal)
self.size_slider.setRange(1, 20)
self.size_slider.setValue(3)
# Режимы
self.draw_btn = QPushButton("✏️")
self.erase_btn = QPushButton("🧹")
self.clear_btn = QPushButton("🗑️")
```
## Интеграция с записью:
```python
class ScreenRecorder:
def __init__(self):
self.drawing_overlay = None
self.overlay_enabled = False
def enable_overlay(self):
self.overlay_enabled = True
self.drawing_overlay = DrawingOverlay()
self.drawing_overlay.show()
def capture_frame_with_overlay(self):
screenshot = pyautogui.screenshot()
if self.overlay_enabled:
# Накладываем рисунок на скриншот
overlay_pixmap = self.drawing_overlay.image
# Объединяем изображения
combined = self.merge_images(screenshot, overlay_pixmap)
return combined
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.