다아라 프로젝트를 원만히 이용하기 위해서는 듀얼모니터 환경이 필요합니다.
한 모니터로는 강의자료를, 한 모니터로는 학생들의 얼굴을 띄워놓는 식으로 회의를 진행하여야 얼굴 캡쳐가 수월하기 때문입니다. 자바스크립트로는 해당 기능을 구현할 수 없었기 때문에 PyQt를 활용하여 제작하였습니다.
[듀얼 모니터 캡쳐]
전체 코드는 나중에 보도록 하고, 우선 듀얼 모니터 캡쳐를 어떻게 구현했는지 살펴보도록 하겠습니다.
PyQt의 Designer를 이용해 해당 화면을 만들어 주었습니다. 여기서 눈여겨 보실 것은 회의화면 모니터와 회의 시작버튼입니다.
class ScreenCaptureClass(QDialog):
capture_screen = 0
meeting_start_hour = 00
meeting_start_minute = 00
meeting_end_hour = 00
meeting_end_minute = 00
capture_cycle = 10
def __init__(self) :
super().__init__()
loadUi("daARA_capture.ui", self)
#모니터 콤보박스 아이템 추가
self.monitor_selector.addItem("모니터 1")
self.monitor_selector.addItem("모니터 2")
# 모니터 콤보박스 아이템 변경시
self.monitor_selector.activated[str].connect(self.ComboBoxOnActivated)
# 시간 설정 관련. TimeEdit의 값이 현재 날짜/시간으로 설정되게 하기
current_time = QTime.currentTime()
self.meeting_start_time.setTime(current_time)
self.meeting_end_time.setTime(current_time)
# 시간을 사용자가 변경시
self.meeting_start_time.timeChanged.connect(self.Start_QTimeEditOnActivated)
self.meeting_end_time.timeChanged.connect(self.End_QTimeEditOnActivated)
# 회의시작, 종료 버튼
self.start_meeting.clicked.connect(self.Start_buttonOnActivated)
self.end_meeting.clicked.connect(self.End_buttonOnActivated)
아나콘다에서 제공하는 Designer툴을 이용해 화면을 구상하면, ui파일이 자동으로 생성됩니다. 이 파일을 load해줍니다.
아래 주석 달린 코드들은 버튼과, 기능을 연결하는 부분입니다.
두번째 주석, #모니터 콤보박스 아이템 변경시를 살펴보겠습니다.
이 코드는 활성화된 콤보박스의 인덱스를 불러와서 ComboBoxOnActivated라는 함수를 호출합니다.
함수 ComboBoxOnActivated는 다음과 같습니다.
def ComboBoxOnActivated(self, text):
if text == "모니터 1":
capture_screen = 0
elif text == "모니터 2":
capture_screen = 1
text로 선택한 아이템을 받아오고, 캡쳐할 스크린을 고릅니다. 이곳에서 인수를 조정하여 캡쳐할 때 듀얼 모니터 중 어떤 모니터를 캡쳐할지 참조합니다.
screens = (getDisplayRects())
rect = getRectAsImage(screens[self.capture_screen])
# rect.save()
rect.show()
print("screen captured")
이 부분은 캡쳐부분입니다. 생각보다 간단합니다. screens를 통해 화면의 갯수를 파악하고, 아까 고른 capture_screen으로 모니터 전체 화면을 캡쳐합니다. 디버깅을 간단하게하기 위해 rect.show()로 캡쳐가 잘됐는지 확인하였습니다.
실제 사용시에는 저 부분을 고쳐서 쓰면 되겠습니다.
[지정된 주기마다 자동 캡쳐하기]
이 부분이 의외로 어려웠습니다. 숱한 구글링에서 얻은 대다수의 답은 Sleep을 이용하는 것이었습니다.
하지만,,, Sleep은 프로그램을 반강제적으로 중단하는 기능이기 때문에 사용하기가 불안했습니다. 엥 이걸 써도 되나..!? 라는 느낌이었죠. 그리고 결정적으로, Sleep기능은 PyQt에서 먹히질 않습니다. Sleep을 그냥 사용했다가는 고통스러워하며 자동으로 중단됩니다.
쓰레딩을 통한 구현에는 실패하였으므로, 숱한 구글링을 통한 결과, PyQt만을 위한 QTime이라는 것이 있었습니다.
steemit.com/python/@gomguk777/pyqt-time-sleep
그래서 구현해보았습니다.
def Start_buttonOnActivated(self):
if (self.meeting_start_hour, self.meeting_start_minute) < (self.meeting_end_hour, self.meeting_end_minute):
while True:
self.screenCapture()
current_time = QTime.currentTime()
if self.end_meeting.clicked is True or ((current_time.hour() == self.meeting_end_hour) & (current_time.minute() == self.meeting_end_minute)):
break
def screenCapture(self):
loop = QEventLoop()
QTimer.singleShot(self.capture_cycle*1000, loop.quit)
screens = (getDisplayRects())
rect = getRectAsImage(screens[self.capture_screen])
# 요기 부분은 피드백을 위해 사진을 보여주는 부분이에여 나중에 서버로 전송하면 돼요!!
# rect.save()
rect.show()
print("screen captured")
loop.exec_()
Start_buttonOnActivated 버튼이 클릭되고, 회의 시작 시간과 회의 종료 시간이 차이가 있으면 screenCapture함수를 부릅니다.
screenCapture함수가 호출되면 이벤트루프가 시작되고, singleShot을 통해 일정한 시간마다 화면 캡쳐가 진행되게 됩니다. self.capture_cycle은 10으로 설정해놓았습니다. 이 파라미터는 msec단위로 캡쳐되므로, 1000을 곱해주었습니다.
듀얼 모니터 캡쳐화면 구성은 여기까지입니다.
다음 포스팅에서는 PyQt에서 다중 레이아웃을 넘나드는 방법을 살펴보겠습니다.
'다아라 개발기' 카테고리의 다른 글
[다아라 개발기] 5. 일렉트론 실시간 화면 캡쳐 (2) | 2021.04.16 |
---|---|
[다아라 개발기] 4. 일렉트론은 alert를 싫어해! (0) | 2021.04.11 |
[다아라 개발기] 3. 파이큐티야 안녕..... (0) | 2021.04.07 |
[다아라 개발기] 2. PyQt에서 다중 레이아웃 넘나들기 (3) | 2021.03.21 |
[다아라 개발기] 0. 다아라 프로젝트 (0) | 2021.03.21 |