로그인을 할 수 있어야 다아라 서비스도 사용할 수 있는데... 레이아웃을 넘나드는 방식을 어떤 식으로 구글링해야할지 감이 안잡혔습니다. 역시 구글의 자동완성기능이 힌트를 주었습니다.
PyQt Switch between multiple layouts
바로 다음과 같은 기능을 어떻게 구현할 수 있는지 알아보겠습니다.
우선 넘나들 두개의 ui를 생성합니다.
저는 위의 사진에서 보실 수 있듯, daARA_login.ui와 daARA_capture.ui를 만들어놨습니다.
우선 메인을 살펴보겠습니다.
if __name__ == "__main__" :
#QApplication : 프로그램을 실행시켜주는 클래스
app = QApplication(sys.argv)
#화면 전환용 Widget 설정
widget = QtWidgets.QStackedWidget()
#레이아웃 인스턴스 생성
mainWindow = MainWindow()
captureWindow = ScreenCaptureClass()
#Widget 추가
widget.addWidget(mainWindow)
widget.addWidget(captureWindow)
#프로그램 화면을 보여주는 코드
widget.setFixedHeight(275)
widget.setFixedWidth(390)
widget.show()
#프로그램을 이벤트루프로 진입시키는(프로그램을 작동시키는) 코드
app.exec_()
우선 메인에서 위젯을 생성합니다. 이 위젯은 스택으로 이루어져 있습니다.
그리고 인스턴스를 생성합니다.
MainWindow클래스에는 daARA_login.ui가 담겨져 있고, ScreenCaptureClass에는 daARA_capture.ui가 담겨져있습니다.
위젯을 스택으로 선언했으므로, 방금 생성한 인스턴스를 담아줍니다.
이제 화면에서 보여질 위젯의 크기를 고정하고, 위젯을 보여줍니다.
class MainWindow(QDialog):
def __init__(self):
super(MainWindow, self).__init__()
loadUi("daARA_login.ui", self)
self.loginBTN.clicked.connect(self.openCaptureClass)
def openCaptureClass(self):
widget.setCurrentIndex(widget.currentIndex()+1)
MainWindow클래스입니다. 로그인화면이지만, 작동이 잘되는 것을 확인하기 위해 별 기능이 없습니다.
loginBTN을 클릭하면 openCaprureClass라는 함수가 실행됩니다. 이 함수의 내부를 살펴보면?!?!
widget.cureentIndex()가 1이 늘어나면서 ScreenCapture UI가 보여지게 됩니다.
다시 첫 화면으로 돌아가려면 어떻게 해야 할까요?
맞습니다. -1을 해주면 됩니다.
다음은 전체 코드입니다. 참고용으로 보시면 되겠습니다.
from __future__ import print_function
from desktopmagic.screengrab_win32 \
import(getDisplayRects,saveScreenToBmp,getScreenAsImage,getRectAsImage,getDisplaysAsImages)
import sys
import threading
import time
import schedule
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5 import uic
import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QDialog, QApplication, QFileDialog
from PyQt5.uic import loadUi
from datetime import datetime
class MainWindow(QDialog):
def __init__(self):
super(MainWindow, self).__init__()
loadUi("daARA_login.ui", self)
self.loginBTN.clicked.connect(self.openCaptureClass)
def openCaptureClass(self):
widget.setCurrentIndex(widget.currentIndex()+1)
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)
def ComboBoxOnActivated(self, text):
if text == "모니터 1":
capture_screen = 0
elif text == "모니터 2":
capture_screen = 1
def Start_QTimeEditOnActivated(self, text):
hour_var = text.toString()
self.meeting_start_hour = int(hour_var[0:2])
self.meeting_start_minute = int(hour_var[3:5])
def End_QTimeEditOnActivated(self, text):
hour_var = text.toString()
self.meeting_end_hour = int(hour_var[0:2])
self.meeting_end_minute = int(hour_var[3:5])
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_()
def End_buttonOnActivated(self):
# 출석부 전송
widget.setCurrentIndex(widget.currentIndex()-1)
def closeEvent(self, event):
self.deleteLater()
if __name__ == "__main__" :
#QApplication : 프로그램을 실행시켜주는 클래스
app = QApplication(sys.argv)
#화면 전환용 Widget 설정
widget = QtWidgets.QStackedWidget()
#레이아웃 인스턴스 생성
mainWindow = MainWindow()
captureWindow = ScreenCaptureClass()
#Widget 추가
widget.addWidget(mainWindow)
widget.addWidget(captureWindow)
#프로그램 화면을 보여주는 코드
widget.setFixedHeight(275)
widget.setFixedWidth(390)
widget.show()
#프로그램을 이벤트루프로 진입시키는(프로그램을 작동시키는) 코드
app.exec_()
'다아라 개발기' 카테고리의 다른 글
[다아라 개발기] 5. 일렉트론 실시간 화면 캡쳐 (2) | 2021.04.16 |
---|---|
[다아라 개발기] 4. 일렉트론은 alert를 싫어해! (0) | 2021.04.11 |
[다아라 개발기] 3. 파이큐티야 안녕..... (0) | 2021.04.07 |
[다아라 개발기] 1. 듀얼 모니터 자동 캡쳐 구현하기 (0) | 2021.03.21 |
[다아라 개발기] 0. 다아라 프로젝트 (0) | 2021.03.21 |