Advertisement
egor230

Рамка

Jul 24th, 2024
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.39 KB | Source Code | 0 0
  1. import json, pyautogui, subprocess, time, os, sys
  2. from PIL import ImageGrab
  3. from PyQt5.QtWidgets import QApplication, QMainWindow
  4. from PyQt5.QtCore import Qt, QPoint, QRect
  5. from PyQt5.QtGui import QPainter, QPen, QMouseEvent
  6. from datetime import datetime
  7. '''
  8. Эта программа позволяет выбрать область экрана, делает её скриншот,
  9. копирует в буфер обмена и сохраняет параметры выбора области экрана в JSON-файл.
  10. '''
  11. def screenshot(left, top, width, height): # print(left, top, width, height, end=' ')
  12.   time.sleep(0.6)
  13.   # Делаем скриншот с заданными размерами и координатами
  14.   screenshot = ImageGrab.grab(bbox=(left, top, left + width, top + height))
  15.  
  16.   now = datetime.now()
  17.   current_date = now.strftime("%Y-%m-%d")
  18.   current_time = now.strftime("%H-%M-%S")
  19.   file_name_path = format("{}screenshot-{}-{}.png".format(
  20. "/mnt/807EB5FA7EB5E954/софт/виртуальная машина/linux must have/python_linux/Project/Screenshots/",
  21.      current_time,
  22.      current_date))
  23.  
  24.   # Сохраняем изображение во временный файл
  25.   screenshot.save(file_name_path, format="PNG")
  26.  
  27.   time.sleep(0.1)
  28.   # Копируем изображение в буфер обмена с помощью xclip
  29.   subprocess.run(['xclip', '-selection', 'clipboard', '-t', 'image/png', '-i', file_name_path])
  30.  
  31.   time.sleep(0.1)
  32.  
  33. def do_screenshot(begin_point, end_point):    # Рассчитываем координаты top-left угла и размеры для скриншота
  34.     left = min(begin_point.x(), end_point.x())
  35.     top = min(begin_point.y(), end_point.y())
  36.     width = abs(end_point.x() - begin_point.x())
  37.     height = abs(end_point.y() - begin_point.y())
  38.  
  39.     # Создаем словарь для сохранения данных
  40.     coords = { 'left': left,  'top': top,
  41.         'width': width, 'height': height
  42.     }
  43.  
  44.     json_file_path = 'settings for screenshot.json'    # Путь к json файлу
  45.  
  46.     # Записываем данные в json файл
  47.     with open(json_file_path, 'w') as json_file:
  48.       json.dump(coords, json_file, indent=4)
  49.     # Вызываем функцию скриншота с расчитанными параметрами
  50.     screenshot(left, top, width, height)
  51.  
  52.  
  53. class TransparentWindow(QMainWindow):
  54.   def __init__(self):
  55.     # Вызываем конструктор класса-предка
  56.     super().__init__()
  57.     # Устанавливаем флаги для окна: без рамки и всегда поверх других окон
  58.     self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
  59.     # Делаем фон окна прозрачным
  60.     self.setAttribute(Qt.WA_TranslucentBackground, True)
  61.     # Задаем окну размер экрана
  62.     self.setGeometry(QApplication.primaryScreen().geometry())
  63.  
  64.     # Флаг, отслеживающий, происходит ли сейчас рисование рамки
  65.     self.drawing = False
  66.     # Начальная точка рамки
  67.     self.begin = QPoint()
  68.     # Конечная точка рамки
  69.     self.end = QPoint()
  70.     # Включаем отслеживание движения мыши по окну
  71.     self.setMouseTracking(True)
  72.     # Отображаем окно
  73.     self.show()
  74.  
  75.   def paintEvent(self, event):
  76.     # Метод, вызываемый каждый раз, когда необходимо перерисовать содержимое окна
  77.     qp = QPainter(self)
  78.     qp.setPen(QPen(Qt.red, 3))  # Устанавливаем красный цвет пера
  79.     rect = QRect(self.begin, self.end)  # Создаем прямоугольник
  80.     qp.drawRect(rect)  # Рисуем прямоугольник
  81.  
  82.   def mousePressEvent(self, event: QMouseEvent): # Проверяем, была ли нажата левая кнопка мыши.
  83.    if event.button() == Qt.LeftButton:
  84.     # Обрабатывает нажатия кнопки мыши
  85.     if self.drawing:
  86.       # Если рисование уже начато, завершаем его
  87.       self.drawing = False
  88.       self.end = event.pos()  # Фиксируем конечную позицию
  89.       self.update()
  90.       self.setMouseTracking(False)  # Выключаем отслеживание мыши
  91.       self.close()  # Закрываем окно
  92.       do_screenshot(self.begin, self.end)  # Делаем скриншот (функция вне класса)
  93.     else:
  94.       # Если рисование не начато, начинаем его
  95.       self.begin = event.pos()  # Фиксируем начальную и конечную позиции
  96.       self.end = event.pos()
  97.       self.drawing = True  # Устанавливаем флаг рисования
  98.       self.update()  # Запрашиваем перерисовку окна
  99.  
  100.   def mouseMoveEvent(self, event: QMouseEvent):
  101.     # Обрабатывает движения мыши
  102.     if self.drawing:
  103.       self.end = event.pos()  # Обновляем конечную точку рамки
  104.       self.update()  # Запрашиваем перерисовку окна
  105.  
  106. if __name__ == '__main__':
  107.   app = QApplication(sys.argv)
  108.   window = TransparentWindow()
  109.   sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement