화면 캡처 프로그램

PyAutoGUI 라이브러리의 스크릿샷 기능을 이용해서 주어진 시간 간격과 횟수에 따라 화면을 캡처하는 프로그램을 만들어 보겠습니다.

(PyAutoGUI - 파이썬 마우스/키보드 자동 조작 모듈)


예제

## Ex 10-4. 화면 캡처 프로그램.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QTimer
import pyautogui
import datetime


class MyApp(QWidget):

    def __init__(self):
        super().__init__()
        self.delay_le = QLineEdit(self)
        self.num_le = QLineEdit(self)
        self.start_btn = QPushButton('Capture', self)

        self.delay, self.num_cap = 0, 0
        self.initUI()

    def initUI(self):
        self.delay_le.setPlaceholderText('캡처 간격 (초)')
        self.num_le.setPlaceholderText('캡처 횟수')
        self.start_btn.clicked.connect(self.start_btn_click)

        hbox = QHBoxLayout()
        hbox.addWidget(self.delay_le)
        hbox.addWidget(self.num_le)

        vbox = QVBoxLayout()
        vbox.addLayout(hbox)
        vbox.addWidget(self.start_btn)

        self.setLayout(vbox)

        self.setWindowTitle('Capture')
        self.setGeometry(200, 200, 300, 150)
        self.show()

    def start_btn_click(self):
        self.delay = int(self.delay_le.text())
        self.num_cap = 0
        self.timer = QTimer()
        self.timer.start(self.delay * 1000)
        self.timer.timeout.connect(self.capture)

    def capture(self):
        today = str(datetime.datetime.today())
        pyautogui.screenshot(today + '.png')
        self.num_cap += 1

        if self.num_cap == int(self.num_le.text()):
            self.timer.stop()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())


설명

self.delay_le = QLineEdit(self)
self.num_le = QLineEdit(self)
self.start_btn = QPushButton('Capture', self)

self.delay, self.num_cap = 0, 0

캡처 사이의 시간 간격과 캡처 횟수를 입력받을 줄 편집기, 그리고 시작 버튼을 만듭니다.

self.delay와 self.num_cap은 시간 간격와 캡처 횟수를 저장하는 변수입니다.



self.delay_le.setPlaceholderText('캡처 간격 (초)')
self.num_le.setPlaceholderText('캡처 횟수')
self.start_btn.clicked.connect(self.start_btn_click)

setPlaceholderText() 메서드는 줄 편집기 위젯에 표시할 텍스트를 설정합니다.

시작 버튼을 클릭하면 self.start_btn_click() 메서드가 호출되도록 합니다.



hbox = QHBoxLayout()
hbox.addWidget(self.delay_le)
hbox.addWidget(self.num_le)

vbox = QVBoxLayout()
vbox.addLayout(hbox)
vbox.addWidget(self.start_btn)

self.setLayout(vbox)

위젯들을 배치하기 위해 박스 레이아웃을 사용합니다.

QHBoxLayout()을 이용해서 수평 박스를 하나 만들고 두 개의 줄 편집기 위젯을 배치합니다.

QVBoxLayout()을 이용해서 수직 박스를 하나 만들어서 수직 박스 (hbox)와 시작 버튼 (self.start_btn)을 수직으로 배치합니다.

그리고 setLayout()을 이용해서 이 수직 박스 (vbox)를 전체 레이아웃으로 설정합니다.

(참고: PyQt5 레이아웃 - 박스 레이아웃)



def start_btn_click(self):
    self.delay = int(self.delay_le.text())
    self.num_cap = 0
    self.timer = QTimer()
    self.timer.start(self.delay * 1000)
    self.timer.timeout.connect(self.capture)

앞의 예제에서와 같이 타이머를 하나 만들고, 입력한 딜레이 값을 가져와서 self.delay에 저장합니다.

start()를 이용해서 self.delay (초) 마다 self.capture 함수가 반복해서 호출되도록 합니다.



def capture(self):
    today = str(datetime.datetime.today())
    pyautogui.screenshot(today + '.png')
    self.num_cap += 1

    if self.num_cap == int(self.num_le.text()):
        self.timer.stop()

capture() 함수는 실제로 화면을 캡처하는 기능을 수행합니다.

저장할 이미지 파일의 이름을 구분하기 위해 datetime 모듈을 사용합니다.

datetime.datetime.today()는 현재 날짜와 시간을 반환합니다.

pyautogui.screenshot()은 화면을 캡처해서 반환하는데, 만약 파일명을 입력해주면 해당 파일명으로 스크린샷 이미지를 저장합니다.

(참고: PyAutoGUI 스크린샷 찍기)



결과

../_images/9_4_screenshot.png

그림 10-4. 화면 캡처 프로그램.



이전글/다음글